node = root;
passed = "Not passed"; // 0 = "Not Passed", 1 = "left subtree passed", 2 = "right subtree passed too"
while (true)
{
switch (passed)
{
case "Not Passed":
traverse(node);
if (node.left != null)
{
node = node.left;
} else
if (node.right != null)
{
node = node.right;
} else // reached to a leaf
{
if (node == root)
break; // Done traversal
passed = "right subtree passed too";
}
case "left subtree passed":
if (node.right != null)
{
node = node.right;
passed = "Not passed";
} else
{
passed = "right subtree passed too";
}
case "right subtree passed too":
if (node.parent == null) // same as to check that node == root
break; // Done traversal
if (node.parent.left == node)
passed = "left subtree passed";
else //right
passed = "right subtree passed too";
node = node.parent;
}
}
**************
Since algorythm passes through each vertex of the tree only one time and thru each edge - not more than
two times, and since edge count in a tree is always less than the vertex count (n)
the application run-time is O(n). it is obvious that memory is constant.
**************