WIP bst & add tests

This commit is contained in:
joachimschmidt557 2019-09-13 19:25:38 +02:00
parent fade1fc218
commit a8fd5241ce

33
bst.rkt
View file

@ -1,20 +1,35 @@
#lang racket
(require rackunit)
(define-struct node (value left right))
(define (search node value)
(cond
[(= (node-value node) value) node]
[(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]
@ -53,8 +68,22 @@
[(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)]))
[(empty? (node-right node)) (node-left node)]
[else (make-node (node-value (replacement node)) (node-left node) (node-right node))]))