trees, implement assoc-size
parent
2bfeecda2b
commit
d2cfbafa13
|
@ -51,3 +51,7 @@ IN: trees.tests
|
||||||
{ 7 "nine" }
|
{ 7 "nine" }
|
||||||
{ 4 "four" }
|
{ 4 "four" }
|
||||||
} height ] unit-test
|
} height ] unit-test
|
||||||
|
|
||||||
|
! test assoc-size
|
||||||
|
{ 3 } [ test-tree assoc-size ] unit-test
|
||||||
|
{ 2 } [ test-tree 9 over delete-at assoc-size ] unit-test
|
||||||
|
|
|
@ -96,18 +96,19 @@ CONSTANT: right 1
|
||||||
M: tree at*
|
M: tree at*
|
||||||
root>> node-at* ;
|
root>> node-at* ;
|
||||||
|
|
||||||
: node-set ( value key node -- node )
|
: node-set ( value key node -- node new? )
|
||||||
2dup key>> key-side dup 0 eq? [
|
2dup key>> key-side dup 0 eq? [
|
||||||
drop nip swap >>value
|
drop nip swap >>value f
|
||||||
] [
|
] [
|
||||||
[
|
[
|
||||||
[ node-link [ node-set ] [ swap <node> ] if* ] keep
|
[ node-link [ node-set ] [ swap <node> t ] if* ] keep
|
||||||
[ set-node-link ] keep
|
swap [ [ set-node-link ] keep ] dip
|
||||||
] with-side
|
] with-side
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
M: tree set-at
|
M: tree set-at
|
||||||
[ [ node-set ] [ swap <node> ] if* ] change-root drop ;
|
[ [ node-set ] [ swap <node> t ] if* swap ] change-root
|
||||||
|
swap [ dup inc-count ] when drop ;
|
||||||
|
|
||||||
: valid-node? ( node -- ? )
|
: valid-node? ( node -- ? )
|
||||||
[
|
[
|
||||||
|
@ -183,21 +184,22 @@ DEFER: delete-node
|
||||||
nip ! right but no left, or no children
|
nip ! right but no left, or no children
|
||||||
] if* ;
|
] if* ;
|
||||||
|
|
||||||
: delete-bst-node ( key node -- node )
|
: delete-bst-node ( key node -- node deleted? )
|
||||||
2dup key>> key-side dup 0 eq? [
|
2dup key>> key-side dup 0 eq? [
|
||||||
drop nip delete-node
|
drop nip delete-node t
|
||||||
] [
|
] [
|
||||||
[
|
[
|
||||||
[ node-link delete-bst-node ]
|
[ node-link delete-bst-node ]
|
||||||
[ set-node-link ]
|
[ swap [ set-node-link ] dip ]
|
||||||
[ ] tri
|
[ swap ] tri
|
||||||
] with-side
|
] with-side
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
M: tree delete-at
|
M: tree delete-at
|
||||||
[ delete-bst-node ] change-root drop ;
|
[ delete-bst-node swap ] change-root
|
||||||
|
swap [ dup dec-count ] when drop ;
|
||||||
|
|
||||||
M: tree new-assoc
|
M: tree new-assoc
|
||||||
2drop <tree> ;
|
2drop <tree> ;
|
||||||
|
|
Loading…
Reference in New Issue