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