⍝ Insert value ⍵ in AVL tree ⍺: put ← ∪ avl ⍝ :: tree ← tree ∇ key value rem ← ~ avl ⍝ :: tree ← tree ∇ key get ← ⍎ avl ⍝ :: value ← tree ∇ key chk ← ? avl ⍝ :: ok height maxbal ← ∇ tree fmt ← ⍕ avl ⍝ :: cmat ← ∇ tree vec ← ∊ avl ⍝ :: (key val)[] ← ∇ tree tree←0∘(put foldl) ⍝ tree from vector of keys. tree ⍳7 ┌─┬─┬─────────────────────────────────────────────────────────┐ │4│0│┌───────────────────────────┬───────────────────────────┐│ │ │ ││┌─┬─┬─────────────────────┐│┌─┬─┬─────────────────────┐││ │ │ │││2│0│┌─────────┬─────────┐│││6│0│┌─────────┬─────────┐│││ │ │ │││ │ ││┌─┬─┬───┐│┌─┬─┬───┐││││ │ ││┌─┬─┬───┐│┌─┬─┬───┐││││ │ │ │││ │ │││1│0│0 0│││3│0│0 0│││││ │ │││5│0│0 0│││7│0│0 0│││││ │ │ │││ │ ││└─┴─┴───┘│└─┴─┴───┘││││ │ ││└─┴─┴───┘│└─┴─┴───┘││││ │ │ │││ │ │└─────────┴─────────┘│││ │ │└─────────┴─────────┘│││ │ │ ││└─┴─┴─────────────────────┘│└─┴─┴─────────────────────┘││ │ │ │└───────────────────────────┴───────────────────────────┘│ └─┴─┴─────────────────────────────────────────────────────────┘ fmt tree ⍳7 ┌─1=1 ┌─2=2┤ │ └─3=3 4=4┤ │ ┌─5=5 └─6=6┤ └─7=7 kseq ← 1↓¨,\' ',12↑⎕a ⍝ key sequence. kseq ┌┬─┬──┬───┬────┬─────┬──────┬───────┬────────┬─────────┬──────────┬───────────┬────────────┐ ││A│AB│ABC│ABCD│ABCDE│ABCDEF│ABCDEFG│ABCDEFGH│ABCDEFGHI│ABCDEFGHIJ│ABCDEFGHIJK│ABCDEFGHIJKL│ └┴─┴──┴───┴────┴─────┴──────┴───────┴────────┴─────────┴──────────┴───────────┴────────────┘ fmt∘tree¨ kseq ⍝ successive inserts A B C ... ┌┬───┬────────┬────────┬─────────────┬─────────────┬─────────────┬─────────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┐ ││A=A│A=A┐ │ ┌─A=A│ ┌<A=A │ ┌<A=A │ ┌─A=A│ ┌─A=A│ ┌─A=A │ ┌─A=A │ ┌─A=A │ ┌─A=A │ ┌─A=A│ ││ │ └>B=B│B=B┤ │B=B┤ │B=B┤ │ ┌─B=B┤ │ ┌─B=B┤ │ ┌<B=B┤ │ ┌<B=B┤ │ ┌<B=B┤ │ ┌<B=B┤ │ ┌─B=B┤ │ ││ │ │ └─C=C│ └>C=C┐ │ │ ┌─C=C│ │ └─C=C│ │ └─C=C│ │ └─C=C │ │ └─C=C │ │ └─C=C │ │ └─C=C │ │ └─C=C│ ││ │ │ │ └>D=D│ └>D=D┤ │D=D┤ │D=D┤ │D=D┤ │D=D┤ │D=D┤ │D=D┤ │ ┌─D=D┤ │ ││ │ │ │ │ └─E=E│ └─E=E┐ │ │ ┌─E=E│ │ ┌<E=E │ │ ┌<E=E │ │ ┌─E=E│ │ ┌─E=E│ │ │ ┌─E=E│ ││ │ │ │ │ │ └>F=F│ └─F=F┤ │ └>F=F┤ │ └>F=F┤ │ │ ┌─F=F┤ │ │ ┌─F=F┤ │ │ └─F=F┤ │ ││ │ │ │ │ │ │ └─G=G│ └>G=G┐ │ │ ┌─G=G│ │ │ └─G=G│ │ │ └─G=G│ │ └─G=G│ ││ │ │ │ │ │ │ │ └>H=H│ └>H=H┤ │ └>H=H┤ │ └>H=H┤ │H=H┤ │ ││ │ │ │ │ │ │ │ │ └─I=I│ └─I=I┐ │ │ ┌─I=I│ │ ┌<I=I │ ││ │ │ │ │ │ │ │ │ │ └>J=J│ └─J=J┤ │ └─J=J┤ │ ││ │ │ │ │ │ │ │ │ │ │ └─K=K│ └>K=K┐ │ ││ │ │ │ │ │ │ │ │ │ │ │ └>L=L│ └┴───┴────────┴────────┴─────────────┴─────────────┴─────────────┴─────────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┘ (tree 12↑⎕a){fmt ⍺⍺ rem foldl ⍵}¨kseq ⍝ successive removals A B .. ┌──────────────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┬─────────────┬─────────────┬─────────────┬────────┬────────┬───┬┐ │ ┌─A=A│ ┌─B=B┐ │ ┌<C=C │ ┌>D=D┐ │ ┌─E=E │ ┌<F=F┐ │ ┌─G=G│ ┌─H=H┐ │ ┌<I=I │ ┌─J=J│K=K┐ │L=L││ │ ┌─B=B┤ │ │ └>C=C│ ┌─D=D┤ │ │ └>E=E│ ┌<F=F┤ │ │ └>G=G │ ┌─H=H┤ │ │ └>I=I│J=J┤ │K=K┤ │ └>L=L│ ││ │ │ └─C=C│ ┌─D=D┤ │ │ │ ┌─E=E│ ┌─F=F┤ │ │ └─G=G │H=H┤ │ │ └─I=I│J=J┤ │ └>K=K┐ │ └─L=L│ │ ││ │ ┌─D=D┤ │ │ │ ┌─E=E│ │ └>F=F┤ │ │ └<G=G │H=H┤ │ │ ┌<I=I │J=J┤ │ └─K=K┐ │ └>L=L│ │ │ ││ │ │ │ ┌─E=E│ │ └─F=F┤ │ │ └─G=G│H=H┤ │ │ ┌<I=I │ └>J=J┤ │ └─K=K┐ │ └>L=L│ │ │ │ ││ │ │ └─F=F┤ │ │ └─G=G│H=H┤ │ │ ┌<I=I │ └>J=J┤ │ └>K=K┐ │ └>L=L│ │ │ │ │ ││ │ │ └─G=G│H=H┤ │ │ ┌<I=I │ └─J=J┤ │ └>K=K┐ │ └>L=L│ │ │ │ │ │ ││ │H=H┤ │ │ ┌<I=I │ └─J=J┤ │ └>K=K┐ │ └>L=L│ │ │ │ │ │ │ ││ │ │ ┌<I=I │ └─J=J┤ │ └>K=K┐ │ └>L=L│ │ │ │ │ │ │ │ ││ │ └─J=J┤ │ └>K=K┐ │ └>L=L│ │ │ │ │ │ │ │ │ ││ │ └>K=K┐ │ └>L=L│ │ │ │ │ │ │ │ │ │ ││ │ └>L=L│ │ │ │ │ │ │ │ │ │ │ ││ └──────────────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┴─────────────┴─────────────┴─────────────┴────────┴────────┴───┴┘ ⍝ successive removals of root node: (tree 12↑⎕a){fmt ⍺⍺ rem foldl ⍵}¨,\' HIJDEFGKBCLA' ┌──────────────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┬─────────────┬─────────────┬─────────────┬─────────────┬────────┬────────┬───┬┐ │ ┌─A=A│ ┌─A=A│ ┌─A=A│ ┌─A=A │ ┌─A=A │ ┌─A=A│ ┌─A=A│ ┌─A=A│ ┌<A=A │ ┌─A=A│ ┌>A=A│A=A││ │ ┌─B=B┤ │ ┌─B=B┤ │ ┌─B=B┤ │ ┌<B=B┤ │ ┌<B=B┤ │ ┌─B=B┤ │ ┌─B=B┤ │ ┌>B=B┤ │B=B┤ │C=C┤ │L=L┘ │ ││ │ │ └─C=C│ │ └─C=C│ │ └─C=C│ │ └─C=C │ │ └─C=C │ │ └─C=C│ │ └─C=C│ │ └─C=C│ │ ┌>C=C│ └─L=L│ │ ││ │ ┌─D=D┤ │ ┌>D=D┤ │ ┌>D=D┤ │D=D┤ │E=E┤ │F=F┤ │G=G┤ │K=K┤ │ └>L=L┘ │ │ │ ││ │ │ │ ┌─E=E│ │ │ ┌─E=E│ │ │ ┌─E=E│ │ ┌─E=E│ │ ┌>F=F┐ │ │ ┌─G=G│ └─K=K┐ │ └<L=L │ │ │ │ ││ │ │ └─F=F┤ │ │ └─F=F┤ │ │ └─F=F┤ │ │ ┌>F=F┤ │ │ │ └>G=G│ └─K=K┤ │ └>L=L│ │ │ │ │ ││ │ │ └─G=G│ │ └─G=G│ │ └─G=G│ │ │ └─G=G│ └>K=K┤ │ └─L=L│ │ │ │ │ │ ││ │H=H┤ │I=I┤ │J=J┤ │ └>K=K┤ │ └<L=L │ │ │ │ │ │ │ ││ │ │ ┌<I=I │ │ ┌─J=J │ └<K=K┐ │ └<L=L │ │ │ │ │ │ │ │ ││ │ └─J=J┤ │ └<K=K┤ │ └>L=L │ │ │ │ │ │ │ │ │ ││ │ └>K=K┐ │ └─L=L │ │ │ │ │ │ │ │ │ │ ││ │ └>L=L│ │ │ │ │ │ │ │ │ │ │ ││ └──────────────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┴─────────────┴─────────────┴─────────────┴─────────────┴────────┴────────┴───┴┘ display fmt tree ⎕a ┌→──────────────────────┐ ↓ ┌─A=A│ │ ┌─B=B┤ │ │ │ └─C=C│ │ ┌─D=D┤ │ │ │ │ ┌─E=E│ │ │ └─F=F┤ │ │ │ └─G=G│ │ ┌─H=H┤ │ │ │ │ ┌─I=I│ │ │ │ ┌─J=J┤ │ │ │ │ │ └─K=K│ │ │ └─L=L┤ │ │ │ │ ┌─M=M│ │ │ └─N=N┤ │ │ │ └─O=O│ │P=P┤ │ │ │ ┌─Q=Q │ │ │ ┌<R=R┤ │ │ │ │ └─S=S │ │ └─T=T┤ │ │ │ ┌─U=U│ │ │ ┌─V=V┤ │ │ │ │ └─W=W│ │ └>X=X┤ │ │ └─Y=Y┐ │ │ └>Z=Z│ └───────────────────────┘ fmt¨ ∪ tree¨↓pmat 5 ⍝ test double rotation. ┌─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┐ │ ┌<1=1 │ ┌─1=1┐ │ ┌─1=1┐ │ ┌─1=1│ ┌>1=1│ ┌>1=1│ │2=2┤ │ │ └>2=2│ │ └>2=2│ ┌>2=2┤ │ ┌─2=2┘ │ ┌─2=2┘ │ │ │ ┌─3=3│3=3┤ │3=3┤ │ │ └─3=3│3=3┤ │3=3┤ │ │ └>4=4┤ │ └─4=4┐ │ │ ┌>4=4│4=4┤ │ └─4=4┐ │ │ ┌>4=4│ │ └─5=5│ └>5=5│ └─5=5┘ │ └<5=5 │ └>5=5│ └─5=5┘ │ └─────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┘ tt←tree ('one'1) ('two'2) ('three'3) ('four'4) ('five'5) ('six'6) ('seven'7) display fmt tt ┌→─────────────────────────────┐ ↓ ┌>five=5 │ │ ┌<four=4┘ │ │one=1┤ │ │ │ ┌>seven=7│ │ │ ┌>six=6┘ │ │ └>three=3┤ │ │ └<two=2 │ └──────────────────────────────┘ vec tt ⍝ enlist of tree. ┌────────┬────────┬───────┬─────────┬───────┬─────────┬───────┐ │┌────┬─┐│┌────┬─┐│┌───┬─┐│┌─────┬─┐│┌───┬─┐│┌─────┬─┐│┌───┬─┐│ ││five│5│││four│4│││one│1│││seven│7│││six│6│││three│3│││two│2││ │└────┴─┘│└────┴─┘│└───┴─┘│└─────┴─┘│└───┴─┘│└─────┴─┘│└───┴─┘│ └────────┴────────┴───────┴─────────┴───────┴─────────┴───────┘ tt ← tt put foldl ('one' 11)('two' 22)('three'33) display fmt tt ┌→───────────────────────────────┐ ↓ ┌>five=5 │ │ ┌<four=4┘ │ │one=11┤ │ │ │ ┌>seven=7│ │ │ ┌>six=6┘ │ │ └>three=33┤ │ │ └<two=22 │ └────────────────────────────────┘ 0 ≡ tt rem foldl 'seven' 'six' 'five' 'four' 'one' 'two' 'three' 1 0 ≡ tt rem foldl 'six' 'four' 'seven' 'three' 'five' 'one' 'two' 1 tt∘get¨ 'two' 'four' 'six' ⍝ search tree for keys. 22 4 6 ⊢tt get 'eight' ⍝ key not in tree. 6::VALUE ERROR chk tt ⍝ ok size mean_depth height. 1 7 2 4 fib←{ ⍝ Depth-⍵ worst-case fibonacci tree. ⊃⍬⍴⎕io{ ⍝ first item is tree. ⍵=0:0 ⍺ ⍝ f 0 → [] ⍵=1:(⍺ 0(0 0))(⍺+1) ⍝ f 1 → ⍺ [] [] l m←⍺ ∇ ⍵-2 ⍝ left subtree and next value r n←(m+1)∇ ⍵-1 ⍝ right .. .. .. .. .. (m 1(l r))n ⍝ f ⍵+1 → ⍺ [f ⍵-2] [f ⍵-1] }⍵ ⍝ :: tree next ← next ∇ depth } display fmt fib 7 ⍝ depth-7 worst-case. ┌→──────────────────────────────────────────────┐ ↓ ┌<1=1 │ │ ┌<2=2┤ │ │ │ └>3=3┐ │ │ │ └>4=4 │ │ ┌<5=5┤ │ │ │ │ ┌<6=6┐ │ │ │ │ │ └>7=7 │ │ │ └>8=8┤ │ │ │ │ ┌<9=9 │ │ │ └>10=10┤ │ │ │ └>11=11┐ │ │ │ └>12=12 │ │13=13┤ │ │ │ ┌<14=14┐ │ │ │ │ └>15=15 │ │ │ ┌<16=16┤ │ │ │ │ │ ┌<17=17 │ │ │ │ └>18=18┤ │ │ │ │ └>19=19┐ │ │ │ │ └>20=20 │ │ └>21=21┤ │ │ │ ┌<22=22 │ │ │ ┌<23=23┤ │ │ │ │ └>24=24┐ │ │ │ │ └>25=25 │ │ └>26=26┤ │ │ │ ┌<27=27┐ │ │ │ │ └>28=28 │ │ └>29=29┤ │ │ │ ┌<30=30 │ │ └>31=31┤ │ │ └>32=32┐ │ │ └>33=33│ └───────────────────────────────────────────────┘ display fmt (fib 7)rem 1 ⍝ removing worst-case node. ┌→───────────────────────────────────────┐ ↓ ┌─2=2 │ │ ┌─3=3┤ │ │ │ └─4=4 │ │ ┌─5=5┤ │ │ │ └─6=6┐ │ │ │ └>7=7 │ │ ┌─8=8┤ │ │ │ │ ┌<9=9 │ │ │ └─10=10┤ │ │ │ └>11=11┐ │ │ │ └>12=12 │ │ ┌─13=13┤ │ │ │ │ ┌<14=14┐ │ │ │ │ │ └>15=15 │ │ │ └─16=16┤ │ │ │ │ ┌<17=17 │ │ │ └>18=18┤ │ │ │ └>19=19┐ │ │ │ └>20=20│ │21=21┤ │ │ │ ┌<22=22 │ │ │ ┌<23=23┤ │ │ │ │ └>24=24┐ │ │ │ │ └>25=25 │ │ └─26=26┤ │ │ │ ┌<27=27┐ │ │ │ │ └>28=28 │ │ └>29=29┤ │ │ │ ┌<30=30 │ │ └>31=31┤ │ │ └>32=32┐ │ │ └>33=33│ └────────────────────────────────────────┘ Alpha test'_BST' ⍝ common BST tests. ⍝∇ avl display foldl pmat Back to: code Back to: Workspaces