Nadesłany przez dariuszlewinski, 13 czerwca 2011 01:25
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
drzewo_1_d.pas:
//Drzewo czerwono-czarne
//www.algorytm.org
program drzewo_red_black;
type kolor=(red,black);
drzewo=^element_drzewa;
element_drzewa=record
key:integer; {klucz, w tym przypadku liczba}
left,right,parent:drzewo; {parent- rodzic danego wezla drzewa}
color:kolor;
end;
procedure Left_Rotate(var T:drzewo; var x:drzewo);
var y:drzewo;
begin
y:=x^.right;
x^.right:=y^.left;
if (y^.left<>nil) then y^.left^.parent:=x;
y^.parent:=x^.parent;
if (x^.parent=nil) then T:=y else
if x=x^.parent^.left then x^.parent^.left:=y else x^.parent^.right:=y;
y^.left:=x;
x^.parent:=y;
end;
procedure Right_Rotate(var T:drzewo;var x:drzewo);
var y:drzewo;
begin
y:=x^.left;
x^.left:=y^.right;
if (y^.right<>nil) then y^.right^.parent:=x;
y^.parent:=x^.parent;
if (x^.parent=nil) then T:=y else
if (x=x^.parent^.right) then x^.parent^.right:=y else
x^.parent^.left:=y;
y^.right:=x;
x^.parent:=y;
end;
procedure BST_Insert(var T:drzewo; var z:drzewo);
var x,y,el:drzewo;
begin
y:=nil;
x:=T;
while (x<>nil) do
begin
y:=x;
if (z^.key<x^.key) then x:=x^.left else x:=x^.right;
end;
z^.parent:=y;
if (y=nil) then T:=z else if (z^.key<y^.key) then y^.left:=z else y^.right:=z;
end;
procedure RB_Insert(var T:drzewo;var z:drzewo);
var y:drzewo;
begin
BST_insert(T,z);
z^.color:=red;
while((z<>T) and (z^.parent^.color=red)) do
begin
if(z^.parent=z^.parent^.parent^.left) then
begin
y:=z^.parent^.parent^.right;
if(y^.color=red) then
begin
z^.parent^.color:=black;
y^.color:=black;
z^.parent^.parent^.color:=red;
z:=z^.parent^.parent;
end
else if(z=z^.parent^.right) then
begin
z:=z^.parent;
left_rotate(T,z);
end
else
begin
z^.parent^.color:=black;
z^.parent^.parent^.color:=red;
right_rotate(T,z^.parent^.parent);
end
end
else
begin
y:=z^.parent^.parent^.left;
if(y^.color=red) then
begin
z^.parent^.color:=black;
y^.color:=black;
z^.parent^.parent^.color:=red;
z:=z^.parent^.parent;
end
else if(z=z^.parent^.left) then
begin
z:=z^.parent;
left_rotate(T,z);
end
else
begin
z^.parent^.color:=black;
z^.parent^.parent^.color:=red;
right_rotate(T,z^.parent^.parent);
end
end
end;
T^.color:=black;
end;
procedure wypisz(var T:drzewo);
begin
if (T<>nil) then
begin
wypisz(T^.left);
writeln(T^.key,',',T^.color);
wypisz(T^.right);
end;
end;
var D,d1:drzewo;
i,ile,liczba:integer;
begin
write('ile wstawiamy ');
readln (ile);
for i:=1 to ile do
begin
write('Podaj liczbe ');
readln(liczba);
new(d1);
d1^.key:=liczba;
d1^.left:=nil;
d1^.right:=nil;
RB_insert(D,d1);
end;
wypisz(D);
readln;
end.

