Lecture 14, July 19

The lecture notes I post serve two purposes: to remind you of the topics we discussed and to provide any interesting code examples I did during lecture. I would describe these notes as an outline, not a summary, of what I talked about during lecture. You are not expected to be able to learn the material simply from examining these notes, nor is reading these notes a reasonable substitute for attending lecture.

2-3-4 Trees

Be sure you can perform insertions and deletions by hand. Be sure you understand the valid? function and how it works.
;; A 2-3-4 tree is either (Empty) or
;; - (2-node (a l m))
;; - (3-node (a b l m n)) 
;; - (4-node (a b c l m n o)) 
;; Where a, b, c are numbers and l, m, n, o are 2-3-4 trees
;; A 2-3-4 tree must always be perfectly balanced
;; A 2-3-4 tree must always satisfy the condition that l < a < m < b < n < o
(define-struct Empty ())
(define-struct 2-node
  ([e0 : Real]
   [t0 : Tree]
   [t1 : Tree]))
(define-struct 3-node
  ([e0 : Real]
   [e1 : Real]
   [t0 : Tree]
   [t1 : Tree]
   [t2 : Tree]))
(define-struct 4-node
  ([e0 : Real]
   [e1 : Real]
   [e2 : Real]
   [t0 : Tree]
   [t1 : Tree]
   [t2 : Tree]
   [t3 : Tree]))

(define-type Tree (U Empty 2-node 3-node 4-node))

(: 2-3-4-insert (Real Tree -> Tree))
(define (2-3-4-insert i t)
  (match t
    [(Empty) (2-node i (Empty) (Empty))]
    [(2-node a (Empty) (Empty))
     (cond
       [(< i a) (3-node i a (Empty) (Empty) (Empty))]
       [(= i a) t]
       [else (3-node a i (Empty) (Empty) (Empty))])]
    [(2-node a l m)
     (cond
       [(< i a)
        (match l
          [(4-node sa sb sc sl sm sn so)
           (cond
             [(< i sb)
              (3-node sb a (2-3-4-insert i (2-node sa sl sm)) (2-node sc sn so) m)]
             [(= i sb) t]
             [else
              (3-node sb a (2-node sa sl sm) (2-3-4-insert i (2-node sc sn so)) m)])]
          [_ (2-node a (2-3-4-insert i l) m)])]
       [(= i a) t]
       [else 
        (match m
          [(4-node sa sb sc sl sm sn so)
           (cond
             [(< i sb)
              (3-node a sb l (2-3-4-insert i (2-node sa sl sm)) (2-node sc sn so))]
             [(= i sb) t]
             [else
              (3-node a sb l (2-node sa sl sm) (2-3-4-insert i (2-node sc sn so)))])]
          [_ (2-node a l (2-3-4-insert i m))])])]
    [(3-node a b (Empty) (Empty) (Empty))
     (cond
       [(< i a) (4-node i a b (Empty) (Empty) (Empty) (Empty))]
       [(= i a) t]
       [(< i b) (4-node a i b (Empty) (Empty) (Empty) (Empty))]
       [(= i b) t]
       [else (4-node a b i (Empty) (Empty) (Empty) (Empty))])]
    [(3-node a b l m n)
     (cond
       [(< i a)
        (match l
          [(4-node sa sb sc sl sm sn so)
           (cond
             [(< i sb)
              (4-node sb a b (2-3-4-insert i (2-node sa sl sm)) (2-node sc sn so) m n)]
             [(= i sb) t]
             [else
              (4-node sb a b (2-node sa sl sm) (2-3-4-insert i (2-node sc sn so)) m n)])]
          [_ (3-node a b (2-3-4-insert i l) m n)])]
       [(= i a) t]
       [(< i b)
        (match m
          [(4-node sa sb sc sl sm sn so)
           (cond
             [(< i sb)
              (4-node a sb b l (2-3-4-insert i (2-node sa sl sm)) (2-node sc sn so) n)]
             [(= i sb) t]
             [else
              (4-node a sb b l (2-node sa sl sm) (2-3-4-insert i (2-node sc sn so)) n)])]
          [_ (3-node a b l (2-3-4-insert i m) n)])]
       [(= i b) t]
       [else
        (match n
          [(4-node sa sb sc sl sm sn so)
           (cond
             [(< i sb)
              (4-node a b sb l m (2-3-4-insert i (2-node sa sl sm)) (2-node sc sn so))]
             [(= i sb) t]
             [else
              (4-node a b sb l m (2-node sa sl sm) (2-3-4-insert i (2-node sc sn so)))])]
          [_ (3-node a b l m (2-3-4-insert i n))])])]
    [(4-node a b c l m n o)
     (cond
       [(< i b) (2-node b (2-3-4-insert i (2-node a l m)) (2-node c n o))]
       [(= i b) t]
       [else (2-node b (2-node a l m) (2-3-4-insert i (2-node c n o)))])]))


(: size (Tree -> Nonnegative-Integer))
(define (size t)
  (match t
    [(Empty) 0]
    [(2-node _ l r) (+ 1 (size l) (size r))]
    [(3-node _ _ l m r) (+ 1 (size l) (size m) (size r))]
    [(4-node _ _ _ l ml mr r) (+ 1 (size l) (size ml) (size mr) (size r))]))

(: search : (Real Tree -> Boolean))
(define (search a t)
  (match t
    [(Empty) #f]
    [(2-node v l r)
     (cond
       [(< a v) (search a l)]
       [(= a v) #t]
       [else (search a r)])]
    [(3-node v w l m r)
     (cond
       [(< a v) (search a l)]
       [(= a v) #t]
       [(< a w) (search a m)]
       [(= a w) #t]
       [else (search a r)])]
    [(4-node v w x l ml mr r)
     (cond
       [(< a v) (search a l)]
       [(= a v) #t]
       [(< a w) (search a ml)]
       [(= a w) #t]
       [(< a x) (search a mr)]
       [(= a x) #t]
       [else (search a r)])]))

(: min (Tree -> Real))
(define (min t)
  (match t
    [(Empty) +inf.0]
    [(2-node v (Empty) _) v]
    [(2-node _ l _) (min l)]
    [(3-node v _ (Empty) _ _) v]
    [(3-node _ _ s _ _) (min s)]
    [(4-node v _ _ (Empty) _ _ _) v]
    [(4-node _ _ _ s _ _ _) (min s)]))


(: max (Tree -> Real))
(define (max t)
  (match t
    [(Empty) -inf.0]
    [(2-node v _ (Empty)) v]
    [(2-node _ _ r) (max r)]
    [(3-node _ v _ _ (Empty)) v]
    [(3-node _ _ _ _ r) (max r)]
    [(4-node _ _ v _ _ _ (Empty)) v]
    [(4-node _ _ _ _ _ _ r) (max r)]))

(: height (Tree -> Nonnegative-Integer))
(define (height t)
  (match t
    [(Empty) 0]
    [(2-node _ l _) (add1 (height l))]
    [(3-node _ _ l _ _) (add1 (height l))]
    [(4-node _ _ _ l _ _ _) (add1 (height l))]))

(: valid-tree (Tree -> Boolean))
(define (valid-tree t)
  (match t
    [(Empty) #t]
    [(2-node v l m)
     (and (< (max l) v)
          (< v (min m))
          (= (height l) (height m))
          (valid-tree l)
          (valid-tree m))]
    [(3-node v w l m n)
     (and (< (max l) v)
          (< v (min m))
          (< (max m) w)
          (< w (min n))
          (= (height l) (height m))
          (= (height m) (height n))
          (valid-tree l)
          (valid-tree m)
          (valid-tree n))]
    [(4-node v w x l m n o)
     (and (< (max l) v)
          (< v (min m))
          (< (max m) w)
          (< w (min n))
          (< (max n) x)
          (< x (min o))
          (= (height l) (height m))
          (= (height m) (height n))
          (= (height n) (height o))
          (valid-tree l)
          (valid-tree m)
          (valid-tree n)
          (valid-tree o))]))
                

(: inorder (Tree -> (Listof Real)))
(define (inorder t)
  (match t
    [(Empty) '()]
    [(2-node v l m)
     (append (inorder l)
             (cons v (inorder m)))]
    [(3-node v w l m n)
     (append (inorder l)
             (append (cons v (inorder m))
                     (cons w (inorder n))))]
    [(4-node v w x l m n o)
     (append (inorder l)
             (append (cons v (inorder m))
                     (append (cons w (inorder n))
                             (cons x (inorder o)))))]))
(foldl 2-3-4-insert (Empty) (build-list 40 (λ ([n : Integer]) (random 100))))

Exam Topics

New Material:

On Quiz 4:

On Quiz 3:

Quiz 2:

Quiz 1: