11.27

今天,开始开小灶了。

记下日子: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:记录祖先根点位置。

posted @ 2015-11-27 22:18  Herrwerner  阅读(109)  评论(0编辑  收藏  举报