Skeleton of generic BST removal with counting.

This commit is contained in:
Dominik Pantůček 2023-07-06 22:23:47 +02:00
parent 0683a20166
commit 915e846b01

View file

@ -15,7 +15,7 @@
bst-contains?
bst-set
;;bst-remove ;;
bst-remove
;;bst->kvv
;;kvv->bst
@ -172,6 +172,36 @@
new-root
(+ (bst-count bst) count-add)))))
(define/doc (bst-remove bst k . nos)
("Removes given key from the BST.")
(let-comparators
(EQ? <? bst)
(let-values
(((new-root sub-count)
(let loop ((n (bst-root bst)))
(if n
(let ((nk (bst-node-key n)))
(if (EQ? nk k)
#f ;; ... from line 212 in util-dict-bst
(if (<? k nk)
(let-values (((new-left-node sub-count)
(loop (bst-node-left n))))
(values (set-bst-node-left n new-left-node)
sub-count))
(let-values (((new-right-node sub-count)
(loop (bst-node-right n))))
(values (set-bst-node-right n new-right-node)
sub-count)))))
(if (and (not (null? nos))
(car nos))
(values #f 0)
(error 'bst-remove "Key does not exist" k))))))
(if (eq? sub-count 0)
bst
(set-bst-root+count bst
new-root
(- (bst-count bst) sub-count))))))
;; Module self-tests
(define (util-bst-tests!)
(run-tests