Set data structures

Need to satisfy set operations union, intersection, is-elem? , adjoin

Different representations possible:

(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 (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 elms n)
  (if (= n 0)
      (cons '() elms)
      (let ((left-size (quotient (- n 1) 2)))
        (let ((left-result (partial-tree elms left-size)))
          (let ((left-tree (car left-result))
                (non-left-elms (cdr left-result))
                (right-size (- n (+ left-size 1))))
            (let ((this-entry (car non-left-elms))
                  (right-result (partial-tree (cdr non-left-elms) 
                                              right-size)))
              (let ((right-tree (car right-result))
                    (remaining-elms (cdr right-result)))
                (cons (make-tree this-entry left-tree right-tree)
                      remaining-elms))))))))

Links

Sources