Skeleton of generic BST removal with counting.
This commit is contained in:
parent
0683a20166
commit
915e846b01
1 changed files with 31 additions and 1 deletions
|
@ -15,7 +15,7 @@
|
||||||
bst-contains?
|
bst-contains?
|
||||||
|
|
||||||
bst-set
|
bst-set
|
||||||
;;bst-remove ;;
|
bst-remove
|
||||||
|
|
||||||
;;bst->kvv
|
;;bst->kvv
|
||||||
;;kvv->bst
|
;;kvv->bst
|
||||||
|
@ -172,6 +172,36 @@
|
||||||
new-root
|
new-root
|
||||||
(+ (bst-count bst) count-add)))))
|
(+ (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
|
;; Module self-tests
|
||||||
(define (util-bst-tests!)
|
(define (util-bst-tests!)
|
||||||
(run-tests
|
(run-tests
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue