program project1;
{$mode objfpc}{$H+}
uses
gtree, gvector, sysutils;
type
TExpression = class(TObject)
public
value: integer;
constructor Create(v: integer);
end;
TExpressionNode = class(specialize TTreeNode<TExpression>)
destructor Destroy; override;
end;
{ TExpressionTree }
TExpressionTree = class(specialize TTree<TExpression>) //inherits from TTree<TExpression>
procedure DepthFirstTraverse(Callback: TDepthFirstCallbackType); //hide original procedure
end;
TIntVector = specialize TVector<integer>;
var
tree: TExpressionTree;
n1, n2, n3, n4, n5, n6, n7: TExpressionNode;
e1, e2, e3, e4, e5, e6, e7: TExpression;
v: TIntVector;
i: integer;
{ TExpressionTree }
procedure TExpressionTree.DepthFirstTraverse(Callback: TDepthFirstCallbackType); //new depth first traverse
var
Stack: TStackType;
Node{,Child}: TTreeNodeType; //Child variable no longer needed
ind : integer;
begin
if Assigned(FRoot) then begin
Stack := TStackType.Create;
Stack.Push(FRoot);
while Stack.Size > 0 do begin
Node := Stack.Top;
Stack.Pop;
Callback(Node.Data);
//for Child in Node.Children do Stack.Push(Child); //(right to left order) replaced by following line
for ind:=Node.Children.Size-1 downto 0 do Stack.Push(Node.Children[ind]); //inverts order of iteration over children
end;
Stack.Free;
end;
end;
constructor TExpression.Create(v: integer);
begin
self.value := v;
end;
destructor TExpressionNode.Destroy;
begin
self.Data.Free;
inherited;
end;
procedure WriteCallback(const e: TExpression);
begin
write(e.value, ' ');
end;
begin
{*
*
* 1
* / \
* 2 3
* / \ / \
* 4 5 6 7
*
* }
e1 := TExpression.Create(1);
e2 := TExpression.Create(2);
e3 := TExpression.Create(3);
e4 := TExpression.Create(4);
e5 := TExpression.Create(5);
e6 := TExpression.Create(6);
e7 := TExpression.Create(7);
n1 := TExpressionNode.Create;
n2 := TExpressionNode.Create;
n3 := TExpressionNode.Create;
n4 := TExpressionNode.Create;
n5 := TExpressionNode.Create;
n6 := TExpressionNode.Create;
n7 := TExpressionNode.Create;
tree := TExpressionTree.Create;
n1.Data := e1;
n2.Data := e2;
n3.Data := e3;
n4.Data := e4;
n5.Data := e5;
n6.Data := e6;
n7.Data := e7;
n1.Children.PushBack(n2);
n1.Children.PushBack(n3);
n2.Children.PushBack(n4);
n2.Children.PushBack(n5);
n3.Children.PushBack(n6);
n3.Children.PushBack(n7);
tree.Root := n1;
tree.DepthFirstTraverse(@WriteCallback);
writeln;
tree.BreadthFirstTraverse(@WriteCallback);
writeln;
tree.Free;
v := TIntVector.Create;
for i := 1 to 10 do
begin
v.PushBack(i);
end;
for i in v do
begin
write(i, ' ');
end;
v.Free;
writeln;
readln;
end.