1 665c255d 2023-08-04 jrmu (define (test-case actual expected)
3 665c255d 2023-08-04 jrmu (display "Actual: ")
4 665c255d 2023-08-04 jrmu (display actual)
6 665c255d 2023-08-04 jrmu (display "Expected: ")
7 665c255d 2023-08-04 jrmu (display expected)
11 665c255d 2023-08-04 jrmu (define (entry tree) (car tree))
12 665c255d 2023-08-04 jrmu (define (left-branch tree) (cadr tree))
13 665c255d 2023-08-04 jrmu (define (right-branch tree) (caddr tree))
14 665c255d 2023-08-04 jrmu (define (make-tree entry left right)
15 665c255d 2023-08-04 jrmu (list entry left right))
17 665c255d 2023-08-04 jrmu (define (element-of-set? x set)
18 665c255d 2023-08-04 jrmu (cond ((null? set) #f)
19 665c255d 2023-08-04 jrmu ((= x (entry set)) #t)
20 665c255d 2023-08-04 jrmu ((< x (entry set))
21 665c255d 2023-08-04 jrmu (element-of-set? x (left-branch set)))
22 665c255d 2023-08-04 jrmu ((> x (entry set))
23 665c255d 2023-08-04 jrmu (element-of-set? x (right-branch set)))))
25 665c255d 2023-08-04 jrmu (define (adjoin-set x set)
26 665c255d 2023-08-04 jrmu (cond ((null? set) (make-tree x '() '()))
27 665c255d 2023-08-04 jrmu ((= x (entry set)) set)
28 665c255d 2023-08-04 jrmu ((< x (entry set))
29 665c255d 2023-08-04 jrmu (make-tree (entry set)
30 665c255d 2023-08-04 jrmu (adjoin-set x (left-branch set))
31 665c255d 2023-08-04 jrmu (right-branch set)))
32 665c255d 2023-08-04 jrmu ((> x (entry set))
33 665c255d 2023-08-04 jrmu (make-tree (entry set)
34 665c255d 2023-08-04 jrmu (left-branch set)
35 665c255d 2023-08-04 jrmu (adjoin-set x (right-branch set))))))
37 665c255d 2023-08-04 jrmu (define (tree->list-2 tree)
38 665c255d 2023-08-04 jrmu (define (copy-to-list tree result-list)
39 665c255d 2023-08-04 jrmu (if (null? tree)
41 665c255d 2023-08-04 jrmu (copy-to-list (left-branch tree)
42 665c255d 2023-08-04 jrmu (cons (entry tree)
43 665c255d 2023-08-04 jrmu (copy-to-list (right-branch tree)
44 665c255d 2023-08-04 jrmu result-list)))))
45 665c255d 2023-08-04 jrmu (copy-to-list tree '()))
47 665c255d 2023-08-04 jrmu (define (list->tree elements)
48 665c255d 2023-08-04 jrmu (car (partial-tree elements (length elements))))
50 665c255d 2023-08-04 jrmu (define (partial-tree elts n)
52 665c255d 2023-08-04 jrmu (cons '() elts)
53 665c255d 2023-08-04 jrmu (let* ((left-size (quotient (- n 1) 2))
54 665c255d 2023-08-04 jrmu (left-results (partial-tree elts left-size))
55 665c255d 2023-08-04 jrmu (left-tree (car left-results))
56 665c255d 2023-08-04 jrmu (right-size (- n (+ left-size 1)))
57 665c255d 2023-08-04 jrmu (right-result (partial-tree (cddr left-results) right-size))
58 665c255d 2023-08-04 jrmu (right-tree (car right-result)))
59 665c255d 2023-08-04 jrmu (cons (make-tree (cadr left-results)
62 665c255d 2023-08-04 jrmu (cdr right-result)))))
64 665c255d 2023-08-04 jrmu (test-case (list->tree '()) '())
65 665c255d 2023-08-04 jrmu (test-case (list->tree '(1)) '(1 () ()))
66 665c255d 2023-08-04 jrmu (test-case (list->tree '(1 2 3 4 5 6 7 8 9 10))
67 665c255d 2023-08-04 jrmu '(5 (2 (1 () ()) (3 () (4 () ()))) (8 (6 () (7 () ())) (9 () (10 () ())))))
70 665c255d 2023-08-04 jrmu ;; Exercise 2.65. Use the results of exercises 2.63 and 2.64 to give O(n) implementations of union-set and intersection-set for sets implemented as (balanced) binary trees.
72 665c255d 2023-08-04 jrmu (define (union-set set1 set2)
73 665c255d 2023-08-04 jrmu (define (union-set-list list1 list2)
74 665c255d 2023-08-04 jrmu (cond ((null? list1) list2)
75 665c255d 2023-08-04 jrmu ((null? list2) list1)
77 665c255d 2023-08-04 jrmu (let ((l1 (car list1))
78 665c255d 2023-08-04 jrmu (l2 (car list2)))
79 665c255d 2023-08-04 jrmu (cond ((= l1 l2)
80 665c255d 2023-08-04 jrmu (cons l1 (union-set-list (cdr list1) (cdr list2))))
82 665c255d 2023-08-04 jrmu (cons l1 (union-set-list (cdr list1) list2)))
84 665c255d 2023-08-04 jrmu (cons l2 (union-set-list list1 (cdr list2)))))))))
85 665c255d 2023-08-04 jrmu (list->tree (union-set-list (tree->list-2 set1)
86 665c255d 2023-08-04 jrmu (tree->list-2 set2))))
89 665c255d 2023-08-04 jrmu (test-case (union-set '() '()) '())
90 665c255d 2023-08-04 jrmu (test-case (union-set (make-tree 5 '() '()) '()) '(5 () ()))
91 665c255d 2023-08-04 jrmu (test-case (union-set '() (make-tree 5 (make-tree 3 '() '()) (make-tree 7 '() '()))) '(5 (3 () ()) (7 () ())))
94 665c255d 2023-08-04 jrmu (make-tree 3
95 665c255d 2023-08-04 jrmu (make-tree 1
96 665c255d 2023-08-04 jrmu (make-tree 0 '() '())
97 665c255d 2023-08-04 jrmu (make-tree 2 '() '()))
98 665c255d 2023-08-04 jrmu (make-tree 5
99 665c255d 2023-08-04 jrmu (make-tree 4 '() '())
100 665c255d 2023-08-04 jrmu (make-tree 6 '() '())))
101 665c255d 2023-08-04 jrmu (make-tree 1
103 665c255d 2023-08-04 jrmu (make-tree 3
105 665c255d 2023-08-04 jrmu (make-tree 5
107 665c255d 2023-08-04 jrmu (make-tree 7
109 665c255d 2023-08-04 jrmu (make-tree 9
112 665c255d 2023-08-04 jrmu '(4 (1 (0 () ()) (2 () (3 () ()))) (6 (5 () ()) (7 () (9 () ())))))
115 665c255d 2023-08-04 jrmu '(3 (1 (0 () ())
117 665c255d 2023-08-04 jrmu (5 (4 () ())
118 665c255d 2023-08-04 jrmu (6 () ())))
119 665c255d 2023-08-04 jrmu '(1 () (3 () (5 () (7 () (9 () ()))))))
120 665c255d 2023-08-04 jrmu '(4 (1 (0 () ()) (2 () (3 () ()))) (6 (5 () ()) (7 () (9 () ())))))
123 665c255d 2023-08-04 jrmu '(1 () (2 () (3 () (5 (4 () ()) (10 (8 (7 () ()) ()) (12 (11 () ()) (14 () ())))))))
124 665c255d 2023-08-04 jrmu '(11 (4 (3 (2 () ()) ()) (9 () ())) (12 () (15 (14 (13 () ()) ()) ()))))
125 665c255d 2023-08-04 jrmu '(8 (3 (1 () (2 () ())) (5 (4 () ()) (7 () ()))) (12 (10 (9 () ()) (11 () ())) (14 (13 () ()) (15 () ())))))
127 665c255d 2023-08-04 jrmu (define (intersection-set set1 set2)
128 665c255d 2023-08-04 jrmu (define (intersection-list list1 list2)
129 665c255d 2023-08-04 jrmu (if (or (null? list1)
130 665c255d 2023-08-04 jrmu (null? list2))
132 665c255d 2023-08-04 jrmu (let ((l1 (car list1))
133 665c255d 2023-08-04 jrmu (l2 (car list2)))
134 665c255d 2023-08-04 jrmu (cond ((= l1 l2) (cons l1 (intersection-list (cdr list1) (cdr list2))))
135 665c255d 2023-08-04 jrmu ((< l1 l2) (intersection-list (cdr list1) list2))
136 665c255d 2023-08-04 jrmu ((> l1 l2) (intersection-list list1 (cdr list2)))))))
137 665c255d 2023-08-04 jrmu (list->tree (intersection-list (tree->list-2 set1)
138 665c255d 2023-08-04 jrmu (tree->list-2 set2))))
140 665c255d 2023-08-04 jrmu (test-case (intersection-set '() '()) '())
141 665c255d 2023-08-04 jrmu (test-case (intersection-set '(5 () ())
144 665c255d 2023-08-04 jrmu (test-case (intersection-set '()
145 665c255d 2023-08-04 jrmu '(5 () ()))
147 665c255d 2023-08-04 jrmu (test-case (intersection-set
149 665c255d 2023-08-04 jrmu '(5 (3 () ()) (7 () ())))
150 665c255d 2023-08-04 jrmu '(3 () ()))
151 665c255d 2023-08-04 jrmu (test-case (intersection-set
152 665c255d 2023-08-04 jrmu '(3 (1 (0 () ()) (2 () ())) (5 (4 () ()) (6 () ())))
153 665c255d 2023-08-04 jrmu '(1 () (3 () (5 () (7 () (9 () ()))))))
154 665c255d 2023-08-04 jrmu '(3 (1 () ()) (5 () ())))
156 665c255d 2023-08-04 jrmu (intersection-set
157 665c255d 2023-08-04 jrmu '(1 () (2 () (3 () (5 (4 () ()) (10 (8 (7 () ()) ()) (12 (11 () ()) (14 () ())))))))
158 665c255d 2023-08-04 jrmu '(11 (4 (3 (2 () ()) ()) (9 () ())) (12 () (15 (14 (13 () ()) ()) ()))))
159 665c255d 2023-08-04 jrmu '(4 (2 () (3 () ())) (12 (11 () ()) (14 () ()))))