90 lines
2.1 KiB
ObjectPascal
90 lines
2.1 KiB
ObjectPascal
{Structure holding node data}
|
|
|
|
type PNode = ^TNode;
|
|
TNode = record
|
|
Data: integer;
|
|
Left,Right: PNode;
|
|
end;
|
|
|
|
|
|
function PreOrder(Node: TNode): string;
|
|
{Recursively traverse Node-Left-Right}
|
|
begin
|
|
Result:=IntToStr(Node.Data);
|
|
if Node.Left<>nil then Result:=Result+' '+PreOrder(Node.Left^);
|
|
if Node.Right<>nil then Result:=Result+' '+PreOrder(Node.Right^);
|
|
end;
|
|
|
|
|
|
function InOrder(Node: TNode): string;
|
|
{Recursively traverse Left-Node-Right}
|
|
begin
|
|
Result:='';
|
|
if Node.Left<>nil then Result:=Result+inOrder(Node.Left^);
|
|
Result:=Result+IntToStr(Node.Data)+' ';
|
|
if Node.Right<>nil then Result:=Result+inOrder(Node.Right^);
|
|
end;
|
|
|
|
|
|
function PostOrder(Node: TNode): string;
|
|
{Recursively traverse Left-Right-Node}
|
|
begin
|
|
Result:='';
|
|
if Node.Left<>nil then Result:=Result+PostOrder(Node.Left^);
|
|
if Node.Right<>nil then Result:=Result+PostOrder(Node.Right^);
|
|
Result:=Result+IntToStr(Node.Data)+' ';
|
|
end;
|
|
|
|
|
|
function LevelOrder(Node: TNode): string;
|
|
{Traverse the tree at each level, Left to right}
|
|
var Queue: TList;
|
|
var NT: TNode;
|
|
begin
|
|
Queue:=TList.Create;
|
|
try
|
|
Result:='';
|
|
Queue.Add(@Node);
|
|
while true do
|
|
begin
|
|
{Display oldest node in queue}
|
|
NT:=PNode(Queue[0])^;
|
|
Queue.Delete(0);
|
|
Result:=Result+IntToStr(NT.Data)+' ';
|
|
{Queue left and right children}
|
|
if NT.left<>nil then Queue.add(NT.left);
|
|
if NT.right<>nil then Queue.add(NT.right);
|
|
if Queue.Count<1 then break;
|
|
end;
|
|
finally Queue.Free; end;
|
|
end;
|
|
|
|
|
|
procedure ShowBinaryTree(Memo: TMemo);
|
|
var Tree: array [0..9] of TNode;
|
|
var I: integer;
|
|
begin
|
|
{Fill array of node with data}
|
|
{that matchs its position in the array}
|
|
for I:=0 to High(Tree) do
|
|
begin
|
|
Tree[I].Data:=I+1;
|
|
Tree[I].Left:=nil;
|
|
Tree[I].Right:=nil;
|
|
end;
|
|
{Build the specified tree}
|
|
Tree[0].left:=@Tree[2-1];
|
|
Tree[0].right:=@Tree[3-1];
|
|
Tree[1].left:=@Tree[4-1];
|
|
Tree[1].right:=@Tree[5-1];
|
|
Tree[3].left:=@Tree[7-1];
|
|
Tree[2].left:=@Tree[6-1];
|
|
Tree[5].left:=@Tree[8-1];
|
|
Tree[5].right:=@Tree[9-1];
|
|
{Tranverse the tree in four specified ways}
|
|
Memo.Lines.Add('Pre-Order: '+PreOrder(Tree[0]));
|
|
Memo.Lines.Add('In-Order: '+InOrder(Tree[0]));
|
|
Memo.Lines.Add('Post-Order: '+PostOrder(Tree[0]));
|
|
Memo.Lines.Add('Level-Order: '+LevelOrder(Tree[0]));
|
|
end;
|