unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 =
class(TForm)
Label1: TLabel;
Button1: TButton;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
PNode = ^TNode;
TNode =
record
name:
string;
ChildNode1,ChildNode2:PNode;
ParentNode:PNode;
end;
var
Form1: TForm1;
Node1,ChildNode1,ChildNode2:PNode;
SubChild1,SubChild2:PNode;
implementation
{$R *.dfm}
procedure createBinaryTree();
var Name:
string;
Begin
// Zeiger erzeugen
new(Node1);
new(ChildNode1);
new(ChildNode2);
new(SubChild1);
new(SubChild2);
// den Knoten zu Überprüfungszwecken einen Namen geben
Node1.
name:='
Wurzel';
ChildNode1.
name:='
ChildNode1';
ChildNode2.
name:='
ChildNode2';
SubChild1.
name:='
SubChild1';
SubChild2.
name:='
SubChild2';
// Node1 ist die Wurzel... daran hängen die Kinderknoten ChildNode1 und ChildNode2
Node1.ParentNode:=nil;
Node1.ChildNode1:=ChildNode1;
Node1.ChildNode2:=ChildNode2;
ChildNode1.ParentNode:=Node1;
ChildNode2.ParentNode:=Node1;
// SubChild1 ist der Kinderknoten von ChildNode1
ChildNode1.ChildNode1:=SubChild1;
SubChild1.ParentNode:=ChildNode1;
// SubChild2 ist der Kinderknoten von SubChild1
SubChild1.ChildNode1:=SubChild2;
SubChild2.ParentNode:=SubChild1;
// Name des Wurzelknotens ermitteln
Name:=ChildNode1.ParentNode.
name;
Form1.Label1.Caption:=Name;
End;
procedure destroyBinaryTree();
Begin
// Speicherbereich der Zeiger wieder freigeben
Dispose(Node1);
Dispose(ChildNode1);
Dispose(ChildNode2);
Dispose(SubChild1);
Dispose(SubChild2);
End;
function getRootNode(Child:PNode):PNode;
Begin
// den Baum solange nach oben durchlaufen, bis die Wurzel erreicht wurde
while Child.ParentNode<>
nil do
Child:=Child.ParentNode;
result:=Child;
End;
function getParentNode(Child:PNode):PNode;
Begin
// den Elternknoten eines gegebenen Knotens ermittelb
if Child.ParentNode<>
nil then
Begin
result:=Child.ParentNode;
exit;
End;
result:=nil;
End;
procedure TForm1.Button1Click(Sender: TObject);
var parent:PNode;
begin
createBinaryTree();
Label2.Caption:=getRootNode(SubChild2).
name;
parent:=getParentNode(SubChild1);
if parent<>
nil
then
Label3.Caption:=parent.
name
else
Label3.Caption:='
Dieser Knoten hat keinen Elternknoten';
destroyBinaryTree();
end;
end.