ПРОГРАММА Unit TreeOb;
Interface
Uses crt;
Type
NodeP=^Node;
NodePV=array[1..3] of NodeP;
Node=record
key: char;
D: integer;
num: integer;
Parent: NodeP;
Child: NodePV;
end;
TTree=object
Public
start, cur: NodeP;
nElem:integer;
Constructor InitEmptyTree;
Destructor Done;
Function NewElem : NodeP;
Procedure FindElem( aKey: char; np: nodeP; indP, indC, find: integer);
Procedure InsRoot;
Procedure InsElem(parentKey: char);
Procedure DeleteElem( np: nodeP; indP, indC: integer);
Procedure DisplayTree( np: nodeP; level: word );
end;
Implementation
Constructor TTree.InitEmptyTree;
Begin
start := NIL;
cur := NIL;
nElem := 0;
End;
Function TTree.NewElem:NodeP;
Var
nnp: NodeP; {NewNodePoint}
i: integer;
begin
new( nnp );
writeln('vvedite letter - key of node');
readln(nnp^.key);
writeln('vvedite integer - data of node');
readln(nnp^.D);
nnp^.num := 1;
nnp^.Parent :=cur;
for i:=1 to 3 do
nnp^.Child[i] := NIL;
NewElem := nnp;
end;
Procedure TTree.FindElem( aKey: char; np: nodeP; indP, indC, find: integer);
begin
if find =0 then
begin
if np = NIL then
begin
writeln( 'Node ', aKey, ' is not found');
cur:=NIL;
end
else
begin
cur := np;
if cur^.key = aKey then
find := 1
else
begin
if indC < cur^.num -1 then
FindElem( aKey, cur^.Child[indC+1], indP, 0, find )
else
begin
if ( cur^.Parent =start ) then
FindElem( aKey, cur^.Parent, indP+1, indP+1, find )
else
FindElem( aKey, cur^.Parent, indP, indC+1, find )
end;
end;
end;
end;
End;
Procedure TTree.InsRoot;
Begin
start:=NewElem;
nElem := nElem+1;
End;
Procedure TTree.InsElem(parentKey: char);
Var
nnp: NodeP;
tempChild: NodePV;
i: integer;
Begin
FindElem( parentKey, start, 0, 0, 0 );
nnp := NewElem;
if cur <> NIL then
begin
if cur^.num > 1 then
begin
for i:=1 to cur^.num-1 do
tempChild[i] :=cur^.Child[i];
end;
tempChild[cur^.num] :=nnp;
cur^.num :=cur^.num+1;
cur^.Child := tempChild;
nElem := nElem + 1;
end;
End;
Procedure TTree.DeleteElem( np: nodeP; indP, indC: integer);
Var
i: integer;
Begin
cur :=np;
if cur <> NIL then
begin
if cur^.num = 1 then
begin
cur :=cur^.Parent;
dispose( np );
np := NIL;
cur^.Child[indP+1] := NIL;
if cur^.Parent =start then
DeleteElem( cur, indP+1, indP+1 )
else
DeleteElem( cur, indP, indC+1)
end
else
begin
if indC < cur^.num -1 then
DeleteElem( cur^.Child[indC+1], indP, 0 )
else
begin
for i:=1 to cur^.num - 1 do
cur^.Child[i] :=NIL;
cur := cur^.Parent;
dispose( np);
np:=NIL;
DeleteElem( cur, indP+1, indC+1 );
end;
end;
end;
End;
Destructor TTree.Done;
begin
if start <> Nil then
DeleteElem( start, 0, 0 )
End;
Procedure TTree.DisplayTree( np: nodeP; level: word);
Var
S: array[1..32] of Char;
S_: array[1..28] of Char;
S1: array[1..16] of Char;
S1_: array[1..12] of Char;
S2: array[1..8] of Char;
S2_: array[1..4] of Char;
i: integer;
begin
FillChar(S, 32, ' ');
FillChar(S1, 16, ' ');
FillChar(S2, 8, ' ');
FillChar(S_, 28, ' ');
FillChar(S1_, 12, ' ');
FillChar(S2_, 4, ' ');
if np <> NIL then
begin
if level = 0 then begin
Writeln(S, np^.key,'(',np^.D,')');
Readln;
end;
if (np^.num > 1) and (level = 0) then
begin
case np^.num - 1 of
1: Writeln(S, np^.Child[1]^.key,'(',np^.Child[1]^.D,')');
2: begin
Write(S1, np^.Child[1]^.key,'(',np^.Child[1]^.D,')');
Writeln(S_, np^.Child[2]^.key,'(',np^.Child[2]^.D,')');
end;
3: begin
Write(S1, np^.Child[1]^.key,'(',np^.Child[1]^.D,')');
Write(S1_, np^.Child[2]^.key,'(',np^.Child[2]^.D,')');
Writeln(S1_, np^.Child[3]^.key,'(',np^.Child[3]^.D,')');
end;
end;
Readln;
end
else if (np^.num > 1) and (level = 1) then
begin
case np^.num - 1 of
1: Writeln(S1,S1,S1, np^.Child[1]^.key,'(',np^.Child[1]^.D,')');
2: begin
Write(S,S2_,S2_, np^.Child[1]^.key,'(',np^.Child[1]^.D,')');
Writeln(S1_, np^.Child[2]^.key,'(',np^.Child[2]^.D,')');
end;
end;
Readln;
end;
if np^.num > 1 then
begin
for i := 1 to np^.num -1 do
begin
if np^.Child[i]^.num > 1 then
DisplayTree(np^.Child[i], level+1);
end;
end;
end;
End;
End.
-----------------------------------------Программа-------------------------------
Program lab6;
uses crt, Treeob;
Var
MyTree:TTree;
i:integer;
Begin
Clrscr;
MyTree.InitEmptyTree;
MyTree.InsRoot;
MyTree.DisplayTree(MyTree.start, 0);
MyTree.InsElem('A');
MyTree.DisplayTree(MyTree.start, 0);
MyTree.InsElem('A');
MyTree.DisplayTree(MyTree.start, 0);
MyTree.InsElem('A');
MyTree.DisplayTree(MyTree.start, 0);
MyTree.InsElem('D');
MyTree.DisplayTree(MyTree.start, 0);
MyTree.InsElem('D');
MyTree.DisplayTree(MyTree.start, 0);
MyTree.Done;
End.