111 lines
No EOL
3.6 KiB
Racket
111 lines
No EOL
3.6 KiB
Racket
#lang racket
|
|
|
|
(require rackunit)
|
|
|
|
(define-struct node (value left right))
|
|
|
|
(define (search node value)
|
|
(cond
|
|
[(empty? node) empty]
|
|
[(= (node-value node) value) node]
|
|
[(> (node-value node) value) (search (node-left node) value)]
|
|
[else (search (node-right node) value)]))
|
|
|
|
(define (contains node value)
|
|
(cond
|
|
[(empty? node) #f]
|
|
[(= (node-value node) value) #t]
|
|
[(> (node-value node) value) (contains (node-left node) value)]
|
|
[else (contains (node-right node) value)]))
|
|
|
|
(check-true (contains (make-node 3 empty empty) 3))
|
|
(check-false (contains (make-node 3 empty empty) 4))
|
|
|
|
(define (insert node value)
|
|
(cond
|
|
[(empty? node) (make-node value empty empty)]
|
|
[(> (node-value node) value) (make-node (node-value node) (insert (node-left node) value) (node-right node))]
|
|
[else (make-node (node-value node) (node-left node) (insert (node-right node) value))]))
|
|
|
|
(check-true (contains (insert empty 3) 3))
|
|
(check-false (contains (insert empty 3) 4))
|
|
|
|
(define (bst-from-list lst)
|
|
(cond
|
|
[(empty? lst) empty]
|
|
[else (insert (bst-from-list (rest lst)) (first lst))]))
|
|
|
|
(check-true (contains (bst-from-list (list 3)) 3))
|
|
(check-true (contains (bst-from-list (list 3 4 2 8)) 2))
|
|
(check-false (contains (bst-from-list (list 3)) 4))
|
|
(check-false (contains (bst-from-list (list 3 7 2 1 5 6)) 4))
|
|
|
|
(define (rotate-right node)
|
|
(if (empty? node) empty
|
|
(let ([x node] [l (node-left node)] [r (node-right node)])
|
|
(let ([a (if (empty? l) empty (node-left l))]
|
|
[b (if (empty? l) empty (node-right l))]
|
|
[c (if (empty? r) empty (node-left r))])
|
|
(make-node (node-value l) a (make-node (node-value x) b r))))))
|
|
|
|
(define (height node)
|
|
(cond
|
|
[(empty? node) 0]
|
|
[else (+ 1 (max (height (node-left node)) (height (node-right node))))]))
|
|
|
|
(define (preorder node)
|
|
(cond
|
|
[(empty? node) empty]
|
|
[else (cons (node-value node) (append (preorder (node-left node)) (preorder (node-right node))))]))
|
|
|
|
(define (postorder node)
|
|
(cond
|
|
[(empty? node) empty]
|
|
[else (append (postorder (node-left node)) (postorder (node-right node)) (list (node-value node)))]))
|
|
|
|
(define (inorder node)
|
|
(cond
|
|
[(empty? node) empty]
|
|
[else (append (inorder (node-left node)) (cons (node-value node) (inorder (node-right node))))]))
|
|
|
|
(check-equal? (inorder (bst-from-list (list 5 2 4 3 7))) (list 2 3 4 5 7))
|
|
|
|
(define (avlcheck node)
|
|
(cond
|
|
[(empty? node) 0]
|
|
[(= (avlcheck (node-left node)) -1) -1]
|
|
[(= (avlcheck (node-right node)) -1) -1]
|
|
[(< 1 (abs (- (avlcheck (node-left node)) (avlcheck (node-right node))))) -1]
|
|
[else (+ 1 (max (avlcheck (node-left node)) (avlcheck (node-right node))))]))
|
|
|
|
(define (min-subtree node)
|
|
(cond
|
|
[(empty? node) empty]
|
|
[(empty? (node-left node)) node]
|
|
[else (min-subtree (node-left node))]))
|
|
|
|
(define (max-subtree node)
|
|
(cond
|
|
[(empty? node) empty]
|
|
[(empty? (node-right node)) node]
|
|
[else (max-subtree (node-right node))]))
|
|
|
|
(define (replacement node)
|
|
(cond
|
|
[(empty? node) empty]
|
|
[(empty? (node-left node)) empty]
|
|
[else (max-subtree (node-left node))]))
|
|
|
|
(define (sans-max-subtree node)
|
|
(cond
|
|
[(empty? node) empty]
|
|
[(empty? (node-right node)) empty]
|
|
[(empty? (node-right (node-right node))) (make-node (node-value node) (node-left node) empty)]
|
|
[else (make-node (node-value node) (node-left node) (sans-max-subtree (node-right node)))]))
|
|
|
|
(define (delete node)
|
|
(cond
|
|
[(empty? node) empty]
|
|
[(empty? (node-left node)) (node-right node)]
|
|
[(empty? (node-right node)) (node-left node)]
|
|
[else (make-node (node-value (replacement node)) (sans-max-subtree (node-left node)) (node-right node))])) |