(use pre-sicp)
(define (entry tree) (car tree))
(define (left-branch tree) (cadr tree))
(define (right-branch tree) (caddr tree))
(define (make-tree symbol l r)
(list symbol l r))
(define (element-of-set? x set)
(let ((e (entry set)))
(cond ((null? set) #f)
((= x e) #t)
((< x e)
(element-of-set? x (left-branch set)))
((> x e)
(element-of-set? x (right-branch set))))))
(define (adjoin-set x set)
(cond ((null? set) (make-tree x '() '()))
((= x (entry set) set))
((< x (entry set))
(make-tree (entry set)
(adjoin-set x (left-branch set))
(right-branch set)))
((> x (entry set))
(make-tree (entry set)
(left-branch set)
(adjoin-set x (right-branch set))))))
(define (tree->list1 tree)
(if (null? tree)
'()
(append (tree->list1 (left-branch tree))
(cons (entry tree)
(tree->list1 (right-branch tree))))))
(define (tree->list2 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 '()))
(let ((no-leaf (lambda (x) (make-tree x '() '())))
(a adjoin-set))
(tree->list2 (a 4 (a 7 (a 5 (no-leaf 3))))))
(define (list->tree elements)
(car (partial-tree elements (length elements))))
(define (partial-tree elts n)
(if (= n 0)
(cons '() elts)
(let* ((left-size (quotient (- n 1) 2))
(left-result (partial-tree elts left-size))
(left-tree (car left-result))
(non-left-elts (cdr left-result))
(right-size (- n (+ left-size 1)))
(this-entry (car non-left-elts))
(right-result (partial-tree (cdr non-left-elts)
right-size))
(right-tree (car right-result))
(remaining-elts (cdr right-result)))
(cons (make-tree this-entry left-tree right-tree)
remaining-elts))))
(list->tree (filter even? (enumerate-interval 1 12)))
(define (display-tree->list tree)
(print (tree->list2 tree)))
(define (display-tree->list2 tree)
(cond ((null? tree) '())
((null? (left-branch tree))
(cond ((null? (right-branch tree))
(display (entry tree)))
(else
(display (entry tree))
(display-tree->list2 (right-branch tree)))))
((null? (right-branch tree))
(display-tree->list2 (left-branch tree))
(display (entry tree)))
(else
(display-tree->list2 (left-branch tree))
(display (entry tree))
(display-tree->list2 (right-branch tree)))))
(let ((target (car (partial-tree (enumerate-interval 1 5) 5))))
(display-tree->list target)
(display-tree->list2 target))
(define (union-set set1 set2)
(list->tree (union-list (tree->list2 set1)
(tree->list2 set2))))
(define (intersection-set set1 set2)
(list->tree (intersection-list (tree->list2 set1)
(tree->list2 set2))))
(define (union-list seq1 seq2)
(cond ((null? seq1) seq2)
((null? seq2) seq1)
(else
(let ((e1 (car seq1)) (e2 (car seq2)))
(cond
((= e1 e2)
(cons e1 (union-list (cdr seq1) (cdr seq2))))
((< e1 e2)
(cons e1 (union-list (cdr seq1) seq2)))
((> e1 e2)
(cons e2 (union-list seq1 (cdr seq2)))))))))
(define (intersection-list seq1 seq2)
(cond ((null? seq1) '())
((null? seq2) '())
(else
(let ((e1 (car seq1)) (e2 (car seq2)))
(cond
((= e1 e2)
(cons e1 (intersection-list (cdr seq1) (cdr seq2))))
((< e1 e2)
(intersection-list (cdr seq1) seq2))
((> e1 e2)
(intersection-list seq1 (cdr seq2))))))))
(let ((t1 (enumerate-interval 1 5))
(t2 (filter odd? (enumerate-interval 1 10))))
(print (union-list t1 t2))
(print (intersection-list t1 t2))
(print (union-set (list->tree t1)
(list->tree t2)))
(print (intersection-set (list->tree t1)
(list->tree t2))))
(define (lookup given-key set-of-records)
(cond ((null? set-of-records) #f)
((equal? given-key (key (car set-of-records)))
(car set-of-records))
(else (lookup given-key (cdr set-of-records)))))
(define (lookup2 given-key set-of-records)
(cond ((null? set-of-records) #f)
(let ((item (entry set-of-records)))
(cond ((= given-key item) #t)
((< given-key item)
(lookup2 given-key (left-branch set-of-records)))
((> given-key item)
(lookup2 given-key (right-branch set-of-records)))))))