Advertisement
Guest User

In-order tree traversal

a guest
Jun 24th, 2015
267
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 3.12 KB | None | 0 0
  1. program InOrderTraversal;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.   SysUtils;
  7.  
  8. type
  9.   TNode<T> = class
  10.   strict private
  11.     fLeft, fRight, fParent: TNode<T>;
  12.     fValue: T;
  13.   public
  14.     constructor Create(const value: T; left, right: TNode<T>);
  15.     destructor Destroy; override;
  16.  
  17.     property Left: TNode<T> read fLeft;
  18.     property Right: TNode<T> read fRight;
  19.     property Parent: TNode<T> read fParent;
  20.     property Value: T read fValue;
  21.   end;
  22.  
  23.   TNodeEnumerator<T> = class
  24.   protected
  25.     fNode: TNode<T>;
  26.     fStarted: Boolean;
  27.     function GetCurrent: T;
  28.   public
  29.     constructor Create(node: TNode<T>);
  30.     function GetEnumerator: TNodeEnumerator<T>;
  31.     function MoveNext: Boolean; virtual;
  32.     property Current: T read GetCurrent;
  33.   end;
  34.  
  35.   TInOrderEnumerator<T> = class(TNodeEnumerator<T>)
  36.   private
  37.     function Next(node: TNode<T>): TNode<T>;
  38.   public
  39.     function MoveNext: Boolean; override;
  40.   end;
  41.  
  42. { TNode<T> }
  43.  
  44. constructor TNode<T>.Create(const value: T; left, right: TNode<T>);
  45. begin
  46.   fValue := value;
  47.   fLeft := left;
  48.   if Assigned(fLeft) then
  49.     fLeft.fParent := Self;
  50.   fRight := right;
  51.   if Assigned(fRight) then
  52.     fRight.fParent := Self;
  53. end;
  54.  
  55. destructor TNode<T>.Destroy;
  56. begin
  57.   fLeft.Free;
  58.   fRight.Free;
  59.   inherited;
  60. end;
  61.  
  62. { TNodeEnumerator<T> }
  63.  
  64. constructor TNodeEnumerator<T>.Create(node: TNode<T>);
  65. begin
  66.   fNode := node;
  67. end;
  68.  
  69. function TNodeEnumerator<T>.GetCurrent: T;
  70. begin
  71.   Result := fNode.Value;
  72. end;
  73.  
  74. function TNodeEnumerator<T>.GetEnumerator: TNodeEnumerator<T>;
  75. begin
  76.   Result := Self;
  77. end;
  78.  
  79. function TNodeEnumerator<T>.MoveNext: Boolean;
  80. begin
  81.   Result := False;
  82. end;
  83.  
  84. { TInOrderEnumerator<T> }
  85.  
  86. function TInOrderEnumerator<T>.Next(node: TNode<T>): TNode<T>;
  87. var
  88.   parent: TNode<T>;
  89. begin
  90.   if Assigned(node.Right) then
  91.   begin
  92.     Result := node.Right;
  93.     while Assigned(Result.Left) do
  94.       Result := Result.Left;
  95.   end
  96.   else
  97.   begin
  98.     Result := node.Parent;
  99.     while Assigned(Result) do
  100.     begin
  101.       if Result.Left = node then
  102.         Break;
  103.       node := Result;
  104.       Result := node.Parent;
  105.     end;
  106.   end;
  107. end;
  108.  
  109. function TInOrderEnumerator<T>.MoveNext: Boolean;
  110. begin
  111.   if not Assigned(fNode) then
  112.     Exit(False);
  113.   if not fStarted then
  114.   begin
  115.     while Assigned(fNode.Left) do
  116.       fNode := fNode.Left;
  117.     fStarted := True;
  118.   end
  119.   else
  120.     fNode := Next(fNode);
  121.   Result := Assigned(fNode);
  122. end;
  123.  
  124. procedure Main;
  125. var
  126.   root: TNode<Integer>;
  127.   i: Integer;
  128. begin
  129.   root := TNode<Integer>.Create(1,
  130.     TNode<Integer>.Create(2,
  131.       TNode<Integer>.Create(4,
  132.         TNode<Integer>.Create(7, nil, nil),
  133.         nil),
  134.       TNode<Integer>.Create(5, nil, nil)
  135.     ),
  136.     TNode<Integer>.Create(3,
  137.       TNode<Integer>.Create(6,
  138.         TNode<Integer>.Create(8, nil, nil),
  139.         TNode<Integer>.Create(9, nil, nil)
  140.       ), nil
  141.     )
  142.   );
  143.  
  144.   for i in TInOrderEnumerator<Integer>.Create(root) do
  145.     Writeln(i);
  146.  
  147.   root.Free;
  148. end;
  149.  
  150. begin
  151.   try
  152.     Main;
  153.   except
  154.     on E: Exception do
  155.       Writeln(E.ClassName, ': ', E.Message);
  156.   end;
  157.   Readln;
  158.   ReportMemoryLeaksOnShutdown := True;
  159. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement