;;; TREES ;;; Procedures for operating on trees ;;; define a couple of trees for testing (define tree1 (cons (list 1 2) (list 3 4))) (define tree2 (list (list 1 2) (list 3 (list 4 5 6)) (list 7 8))) ;;; procedure to count the leaves of a tree (define (count-leaves tree) (cond ((null? tree) 0) ((not (pair? tree)) 1) (else (+ (count-leaves (car tree)) (count-leaves (cdr tree)))))) ;;; fringe returns a list of the leaves of the tree (define (fringe tree) (cond ((null? tree) nil) ((not (pair? tree)) (list tree)) (else (append (fringe (car tree)) (fringe (cdr tree)))))) ;;; sum-fringe returns the sum of the leaves of a tree (define (sum-fringe tree) (cond ((null? tree) 0) ((number? tree) tree) (else (+ (sum-fringe (car tree)) (sum-fringe (cdr tree)))))) ;;; map-tree applies a procedure to each leaf of the tree (define (map-tree tree op) (cond ((null? tree) nil) ((number? tree) (op tree)) (else (cons (map-tree (car tree) op) (map-tree (cdr tree) op))))) ;;; write scale-tree using map-tree (define (scale-tree tree factor) (map-tree tree (lambda (x) (* x factor)))) ;;; write increment-tree using map-tree (define (increment-tree tree) (map-tree tree inc))