2.63
; Each of the following two procedures converts a binary tree to a list.
(define (tree->list-1 tree)
(if (null? tree)
'()
(append (tree->list-1 (left-branch tree))
(cons (entry tree)
(tree->list-1
(right-branch tree))))))
(define (tree->list-2 tree)
(define (copy-to-list tree result-list)
(if (null? tree)
result-list
(copy-to-list (left-branch tree)
(cons (entry tree)
(copy-to-list
(right-branch tree)
result-list)))))
(copy-to-list tree '()))
; (a) Do the two procedures produce the same result for
; every tree? If not, how do the results differ? What lists
; do the two procedures produce for the trees in Figure 2.16?
(define (entry tree) (car tree))
(define (left-branch tree) (cadr tree))
(define (right-branch tree) (caddr tree))
(define (make-tree entry left right)
(list entry left right))
; Test for all 3 trees in Figure 2.16
(define tree1 (list 7 (list 3 (list 1 '() '()) (list 5 '() '()))
(list 9 '() (list 11 '() '()))))
(define tree2
(list 3 (list 1 '() '())
(list 7 (list 5 '() '())
(list 9 '() (list 11 '() '())))))
(define tree3
(list 5 (list 3 (list 1 '() '()) '())
(list 9 (list 7 '() '())
(list 11 '() '()))))
(tree->list-1 tree1) ;(1 3 5 7 9 11)
(tree->list-2 tree1) ;(1 3 5 7 9 11)
(tree->list-1 tree2) ;(1 3 5 7 9 11)
(tree->list-2 tree2) ;(1 3 5 7 9 11)
(tree->list-1 tree3) ;(1 3 5 7 9 11)
(tree->list-2 tree3) ;(1 3 5 7 9 11)
; Ans: Both the procedures produce the same results for every tree
; For all 3 figures in Fig 2.16, list is (1 3 5 7 9 11)
; (b) Do the two procedures have the same order of growth in the number of
; steps required to convert a balanced tree with n elements to a list?
; If not, which one grows more slowly?
; Ans
; tree->list-1 takes O(n log n) time
; tree->list-2 takes O(n) time