unit AVLUnit;
interface
type wsk = ^wezel;
wezel = record
klucz: integer;
lewe, prawe: wsk;
wywaz: -1..+1;
end;
procedure wstawianie(x:integer; var p: wsk; var h: boolean);
procedure usuwanie(x:integer; var p:wsk; var h:boolean);
procedure rotacjawprawo(var p:wsk; var h:boolean);
procedure rotacjawlewo(var p:wsk; var h:boolean);
procedure usun (var r:wsk; var t:wsk; var h:boolean);
procedure drukujAVL (T:wsk; n:integer);
implementation
procedure wstawianie(x:integer; var p: wsk; var h: boolean);
var p1,p2: wsk;
BEGIN
if p=NIL then
begin
new(p);
h:=true;
p^.klucz:=x;
p^.lewe:=NIL;
p^.prawe:=NIL;
p^.wywaz:=0;
end
else
if x
begin
wstawianie(x, p^.lewe, h);
if h then
case p^.wywaz of
1: begin
p^.wywaz:=0; h:=false;
end;
0: p^.wywaz:=-1;
-1: begin
p1:=p^.lewe;
if p1^.wywaz=-1 then
begin
{pojedyncza rotacja w lewo}
p^.lewe:=p1^.prawe;
p1^.prawe:=p;
p^.wywaz:=0;
p:=p1;
end
else
begin
{podwojna rotacja w lewo}
p2:=p1^.prawe;
p1^.prawe:=p2^.lewe;
p2^.lewe:=p1;
p^.lewe:=p2^.prawe;
p2^.prawe:=p;
if p2^.wywaz=-1 then p^.wywaz:=1 else p^.wywaz:=0;
if p2^.wywaz=1 then p1^.wywaz:=-1 else p1^.wywaz:=0;
p:=p2;
end;
p^.wywaz:=0;
h:=false;
end;
end;
end
else
if x>p^.klucz then
begin
wstawianie(x, p^.prawe, h);
if h then
case p^.wywaz of
-1: begin
p^.wywaz:=0; h:=false;
end;
0: p^.wywaz:=1;
1: begin
p1:=p^.prawe;
if p1^.wywaz=1 then
begin
{pojedyncza rotacja w prawo}
p^.prawe:=p1^.lewe;
p1^.lewe:=p;
p^.wywaz:=0;
p:=p1;
end
else
begin
{podwojna rotacja w prawo}
p2:=p1^.lewe;
p1^.lewe:=p2^.prawe;
p2^.prawe:=p1;
p^.prawe:=p2^.lewe;
p2^.lewe:=p;
if p2^.wywaz=1 then p^.wywaz:=-1 else p^.wywaz:=0;
if p2^.wywaz=-1 then p1^.wywaz:=1 else p1^.wywaz:=0;
p:=p2;
end;
p^.wywaz:=0;
h:=false;
end;
end;
end
else
begin
Writeln('*** ODNALEZIONO ***');
Writeln('*** KLUCZ ***');
h:=false;
end;
END;
procedure rotacjawprawo(var p:wsk; var h:boolean);
var p1,p2:wsk;
BEGIN
case p^.wywaz of
-1:p^.wywaz:=0;
0:begin
p^.wywaz:=1;
h:=false;
end;
1:begin
p1:=p^.prawe;
if p^.wywaz>=0 then
{pojedyncza rotacja}
begin
p^.prawe:=p1^.lewe;
p1^.lewe:=p;
if p^.wywaz = 0 then
begin
p^.wywaz:=1;
p1^.wywaz:=-1;
h:=false;
end
else
begin
p^.wywaz:=0;
p1^.wywaz:=0;
end;
p:=p1;
end
else
{podwojna rotacja}
begin
p2:=p1^.lewe;
p1^.lewe:=p2^.prawe;
p2^.prawe:=p1;
p^.prawe:=p2^.lewe;
p2^.lewe:=p;
if p2^.wywaz=1 then p^.wywaz:=-1 else p^.wywaz:=0;
if p2^.wywaz=-1 then p^.wywaz:=1 else p^.wywaz:=0;
p:=p2;
p2^.wywaz:=0;
end;
end;
end;
END;
procedure rotacjawlewo(var p:wsk; var h:boolean);
var p1,p2:wsk;
BEGIN
case p^.wywaz of
1:p^.wywaz:=0;
0:begin
p^.wywaz:=-1;
h:=false;
end;
-1:begin
p1:=p^.lewe;
if p1^.wywaz<=0 then
{pojedyncza rotacja}
begin
p^.lewe:=p1^.prawe;
p1^.prawe:=p;
if p1^.wywaz = 0 then
begin
p^.wywaz:=-1;
p1^.wywaz:=1;
h:=false;
end
else
begin
p^.wywaz:=0;
p1^.wywaz:=0;
end;
p:=p1;
end
else
{podwojna rotacja}
begin
p2:=p1^.prawe;
p1^.prawe:=p2^.lewe;
p2^.lewe:=p1;
p^.lewe:=p2^.prawe;
p2^.prawe:=p;
if p2^.wywaz=1 then p^.wywaz:=-1 else p^.wywaz:=0;
if p2^.wywaz=-1 then p^.wywaz:=1 else p^.wywaz:=0;
p:=p2;
p2^.wywaz:=0;
end;
end;
end;
END;
procedure usun (var r:wsk; var t:wsk; var h:boolean);
BEGIN
if r^.prawe<>NIL then
begin
usun(r^.prawe,t,h);
if h then rotacjawlewo(r,h);
end
else
begin
t^.klucz:=r^.klucz;
r:=r^.lewe;
h:=true;
end;
END;
procedure usuwanie(x:integer; var p:wsk; var h:boolean);
var q,r: wsk;
BEGIN
if p=NIL then
begin
{brak klucza w drzewie}
Writeln('*** BRAK KLUCZA ***');
h:=false;
end
else
if x
begin
usuwanie(x,p^.lewe,h);
if h then rotacjawprawo(p,h);
end
else
if x>p^.klucz then
begin
usuwanie(x,p^.prawe,h);
if h then rotacjawlewo(p,h);
end
else
begin
q:=p;
if q^.prawe = NIL then
begin
p:=q^.lewe;
h:=true;
end
else
if q^.lewe = NIL then
begin
p:=q^.prawe;
h:=true;
end
else
begin
usun(q^.lewe, q, h);
if h then rotacjawprawo(p,h);
end;
{dispose(q);}
end;
END;
procedure drukujAVL (T:wsk; n:integer);
var i: integer;
begin
if T<>NIL then
begin
drukujAVL (T^.prawe, n+1);
for i:=1 to n do
Write(' ');
Writeln(T^.klucz);
drukujAVL (T^.lewe, n+1);
end;
end;
END.
************************************************************************
unit BSTUnit;
interface
type ptr = ^wezelek;
wezelek = record
klucz: integer;
lewe, prawe: ptr;
end;
procedure drukujBST(w: ptr; n:integer);
procedure przeszukanie (x: integer; var p: ptr);
procedure wyrzucenie(x:integer; var p: ptr);
implementation
procedure drukujBST(w: ptr; n:integer);
var i:integer;
begin
if w<>NIL then
begin
drukujBST(w^.lewe, n+1);
for i:=1 to n do Write(' ');
Writeln(w^.klucz);
drukujBST(w^.prawe, n+1);
end;
end;
procedure wyrzucenie(x:integer; var p: ptr);
var q: ptr;
procedure us(var r:ptr);
begin
if r^.prawe<>NIL then us(r^.prawe) else
begin
q^.klucz:=r^.klucz;
q:=r;
r:=r^.lewe;
end;
end;
begin {wyrzuceniue}
if p= NIL then Writeln('### BRAK KLUCZA ###') else
if x
if x>p^.klucz then wyrzucenie(x,p^.prawe) else
begin
q:=p;
if q^.prawe = NIL then p:=q^.lewe else
if q^.lewe = NIL then p:=q^.prawe else
us(q^.lewe);
end;
end;
procedure przeszukanie (x: integer; var p: ptr);
begin
if p=NIL then
begin
new (p);
p^.klucz:=x;
p^.lewe:=NIL;
p^.prawe:=NIL;
end
else
if x
if x>p^.klucz then przeszukanie(x,p^.prawe) else
begin
Writeln('### ODNALEZIONO ###');
Writeln('### KLUCZ ###');
end;
end;
END.
************************************************************************
program drzewaAVLBST;
uses crt, AVLUnit, BSTUnit;
var
p:wsk;
t:ptr;
z: Integer;
{*******************DRUKOWANIE **********************}
procedure PrintAVL;
begin
window(5,14,26,24);
TextBackground(Magenta);
TextColor(Yellow);
ClrScr;
Writeln('Twoje drzewo AVL: ');
drukujAVL(p,0);
end;
procedure PrintBST;
begin
window (27,14,60,24);
TextBackground(Magenta);
TextColor(Green);
ClrScr;
Writeln('Twoje drzewo BST:');
drukujBST(t,0);
end;
{********************WSTAWIANIE *********************}
procedure Insert(i:integer);
var x:integer;
h:boolean;
begin
Writeln('Podaj wartosc wag:');
Readln(x);
case i of
1:begin
wstawianie(x,p,h);
Readln;
ClrScr;
PrintAVL;
end;
2:begin
przeszukanie(x,t);
Readln;
ClrScr;
PrintBST;
end;
end;
end;
{***********************USUWANIE************************}
procedure Delete(i:integer);
var x:integer;
h:boolean;
begin
Writeln('Element do usuniecia:');
Readln(x);
case i of
1:begin
usuwanie(x,p,h);
Readln;
ClrScr;
PrintAvl;
end;
2:begin
wyrzucenie(x,t);
Readln;
ClrScr;
PrintBST;
end;
end;
end;
procedure menu;
begin
Writeln ("DRZEWA AVL I BST");
Writeln ("1. Wstaw/wyszukaj w drzewie AVL");
Writeln ("2. Usun z drzewa AVL");
Writeln ("3. Wstaw/wyszukaj w drzewie BST");
Writeln ("4. Usun z drzewa BST");
Writeln ("5. Wyjscie");
end;
BEGIN
menu;
readln (z);
while z<5 do
begin
menu;
case z of
1: Insert(1);
2: Delete(1);
3: Insert(2);
4: Delete(2);
end;
readln(z);
end;
END.