SOURCE FILE: inorderNonRecursive
A NON-RECURSIVE IMPLEMENTATION OF AN IN-ORDER TRAVERSAL.
This example illustrates that sometimes a non-recursive method
of solving a problem can be quite complex.
(* p is a pointer to the tree to be traversed *)
PROCEDURE Inorder(p: NodePtr) ;
VAR S: stack ; (* declare stack variable S *)
ok, finished :boolean ;
BEGIN (* procedure Inorder *)
Stacks.Create(S,ok) ; (* initialize the stack *)
WHILE p <> nil (* as long as p points somewhere *)
DO BEGIN (* outer while loop *)
(* as long as you can go left from where p points. *)
WHILE p^.left <> nil
DO BEGIN (* inner while loop *)
Push(S,p) ; (* push p onto the stack *)
p := p^.left ; (* advance p to the left *)
end (* inner while loop *)
finished := false ;
REPEAT
Process(p) ; (* Print what's in the node, or whatever. *)
IF p^.right = nil ; (* if there is no node to the right *)
THEN BEGIN
IF NOT Stacks.Empty(S) (* if the stack is not empty *)
THEN Pop(S,p) (* pop a pointer off the stack *)
ELSE BEGIN
finished := true ; (* signal to stop repeat loop *)
p := nil ; (* signal to stop outer while loop *)
end
end
ELSE BEGIN (* work on the right subtree *)
p := p^.right ; (* point at the right subtree *)
finished := true ; (* signal to stop repeat loop *)
END
UNTIL finished ;
END (* outer while loop *)
Stack.Terminate(S) ; (* deallocate the stack *)
END (* procedure Inorder *)