8.18 shape            : 50[11]{30[6]{20[2]{10[1],.},40[3]{35[1],45[1]}},70[4]{60[2]{.,65[1]},80[1]}}
8.18 valid OS tree    : yes   (fault: none)
8.18 after corrupting : no   (fault: node 50 stores size 99 but the truth is 11)
8.18 repaired         : yes

8.19 all values       : 10 20 30 35 40 45 50 60 65 70 80 
8.19 in [30,60]       : 30 35 40 45 50 60 
8.19 in [41,44]       : (nothing)

8.20 k-th smallest    : 10 20 30 35 40 45 50 60 65 70 80
8.20 select(6) = 45 after 4 node probes (n = 11, h = 3)

8.21 weight-balanced  : yes   (fault: none)
8.21 handcrafted tree : 100[10]{40[7]{20[3]{10[1],30[1]},60[3]{50[1],70[1]}},200[2]{.,300[1]}}
8.21 is it AVL?       : yes
8.21 weight-balanced? : no   (fault: node 100: left size 7, right size 2)

8.22 insert 5, 15, 25 one at a time
      after  5: rot=1, h=3, n=12, valid=yes
      after 15: rot=0, h=4, n=13, valid=yes
      after 25: rot=0, h=4, n=14, valid=yes
      shape: 50[14]{30[9]{10[5]{5[1],20[3]{15[1],25[1]}},40[3]{35[1],45[1]}},70[4]{60[2]{.,65[1]},80[1]}}

8.25 delete 50 (two children), then 10, then 999 (absent)
      after  50: rot=0, h=4, n=13, valid=yes
      after  10: rot=1, h=4, n=12, valid=yes
      after 999: rot=0, h=4, n=12, valid=yes
      shape: 45[12]{30[7]{20[4]{5[2]{.,15[1]},25[1]},40[2]{35[1],.}},70[4]{60[2]{.,65[1]},80[1]}}

stress: insert 1..2000 ascending, select every 200th, delete all
      n=2000, h=10, rot=1989, valid=yes
      select(k) for k = 200,400,...,2000 : 200 400 600 800 1000 1200 1400 1600 1800 2000
      after deleting all: n=0, isEmpty=true
