Skip to content

sets-tree

; Sets as trees
(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))

; element-of-set? operation
(define (element-of-set? x set)
    (cond ((null? set) #f)
          ((= x (entry set)) #t)
          ((< x (entry set))
            (element-of-set? x (left-branch set)))
          ((> x (entry set))
            (element-of-set? x (right-branch set)))))

; Testing `element-of-set?`
(define set1 (list 7 (list 3 (list 1 '() '()) (list 5 '() '())) 
                     (list 9 '() (list 11 '() '()))))

(entry set1) ;Value: 7
(left-branch set1) ;(3 (1) (5))
(right-branch set1) ;(9 () (11))

(element-of-set? 7 set1) ;#t
(element-of-set? 1 set1) ;#t
(element-of-set? 11 set1) ;#t
(element-of-set? 12 set1) ;#f

; Adjoin operation
(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))))))

; Test adjoin
(adjoin-set 8 set1)
; (7 (3 (1 () ()) (5 () ())) (9 (8 () ()) (11 () ())))