Skip to content

Instantly share code, notes, and snippets.

@yakreved
Created August 29, 2013 17:30
Show Gist options
  • Save yakreved/6381004 to your computer and use it in GitHub Desktop.
Save yakreved/6381004 to your computer and use it in GitHub Desktop.
sicp 2.65
(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))
(define (tree->list 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 '()))
(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)))
(let ((left-result (partial-tree elts left-size)))
(let ((left-tree (car left-result))
(non-left-elts (cdr left-result))
(right-size (- n (+ left-size 1))))
(let ((this-entry (car non-left-elts))
(right-result (partial-tree (cdr non-left-elts)
right-size)))
(let ((right-tree (car right-result))
(remaining-elts (cdr right-result)))
(cons (make-tree this-entry left-tree right-tree)
remaining-elts))))))))
(define (intersection-set set1 set2)
(if (or (null? set1) (null? set2))
'()
(let ((x1 (car set1)) (x2 (car set2)))
(cond ((= x1 x2)
(cons x1
(intersection-set (cdr set1)
(cdr set2))))
((< x1 x2)
(intersection-set (cdr set1) set2))
((< x2 x1)
(intersection-set set1 (cdr set2)))))))
(define (union-set x y)
(cond
((null? x) y)
((null? y) x)
((= (car x) (car y))
(cons (car x) (union-set (cdr x) (cdr y))))
((< (car x) (car y))
(cons (car x) (union-set (cdr x) y)))
(else (cons (car y) (union-set x (cdr y))))))
(define tree1 (make-tree 7
(make-tree 3
(make-tree 1 '() '())
(make-tree 5 '() '()))
(make-tree 9
'()
(make-tree 10 '() '()))))
(define tree2 (make-tree 3
(make-tree 1 '() '())
(make-tree 7
(make-tree 5 '() '())
(make-tree 9
'()
(make-tree 24 '() '())))))
(define (union-tree a b)
(list->tree (union-set (tree->list a) (tree->list b)))
)
(union-tree tree1 tree2)
(define (intersection-tree a b)
(list->tree (intersection-set (tree->list a) (tree->list b)))
)
(intersection-tree tree1 tree2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment