标签:
今天,开始开小灶了。
记下日子:11.27。
学了平衡树,左旋右旋的。
附上自己写一半的程序:
1 procedure init(n,i:longint); 2 begin 3 a[i].l:=i*2; 4 a[i].r:=i*2+1; 5 a[i].side:=0; 6 a[i].fix:=random(100001); 7 if i*4+1<=n then 8 init(n,i*2); 9 if i*4+3<=n then 10 init(n,i*2+1); 11 end; 12 13 procedure left(p:longint); 14 var tmp:longint; 15 begin 16 tmp:=a[p].l; 17 a[p].l:=a[tmp].r; 18 a[tmp].r:=p; 19 p:=tmp; 20 a[p].side:=a[a[p].l].side+a[a[p].r].side+1; 21 end; 22 23 procedure right(p:longint); 24 var tmp:longint; 25 begin 26 tmp:=a[p].r; 27 a[p].r:=a[tmp].l; 28 a[tmp].l:=p; 29 p:=tmp; 30 a[p].side:=a[a[p].l].side+a[a[p].r].side+1; 31 end; 32 33 procedure insert(x,p:longint); 34 begin 35 if a[p].n=-1 then 36 begin 37 a[p].n:=x; 38 exit; 39 end 40 else 41 if a[p].n>x then 42 insert(x,a[p].l) 43 else insert(x,a[p].r); 44 if a[p].fix<a[a[p].l].fix then 45 right(p); 46 if a[p].fix>a[a[p].r].fix then 47 left(p); 48 node:=p; 49 end; 50 51 procedure all(k,p:longint); 52 begin 53 if a[p].n=-1 then exit 54 else 55 begin 56 a[p].n:=a[p].n+k; 57 if a[p].l<>-1 then 58 all(k,a[p].l); 59 if a[p].r<>-1 then 60 all(k,a[p].r); 61 end; 62 end; 63 64 procedure del(k,p:longint); 65 var tmp:longint; 66 begin 67 if a[p].n-k<min then 68 begin 69 a[p].n:=-1; 70 inc(leave,a[p].side-a[a[p].r].side); 71 exit; 72 end 73 else 74 begin 75 if a[p].l<>-1 then 76 begin 77 del(k,a[p].l); 78 if a[a[p].l].n=-1 then 79 begin 80 a[p].side:=a[p].side-a[a[p].l].side; 81 a[p].l:=a[a[p].l].r; 82 end; 83 end; 84 if a[p].r<>-1 then 85 begin 86 del(k,a[p].r); 87 if a[a[p].r].n=-1 then 88 begin 89 tmp:=a[a[p].r].r; 90 a[p].side:=a[p].side-a[a[p].r].side+a[tmp].side; 91 a[p].r:=tmp; 92 93 end; 94 end; 95 end; 96 node:=p; 97 end;
node:记录祖先根点位置。
标签:
原文地址:http://www.cnblogs.com/Herrwerner/p/5001878.html