How to do in-order traversal of a BST without recursion or stack but using parent pointers?

algorithm, binary-search-tree, inorder, iteration, tree-traversal

Solution

You can do that, you just need to remember the last visited node along with the current node. Doing this is not disallowed by the problem statement: both `visited` flag on each node and a `stack` are (worst case) O(n), remembering the last node is just O(1).

In C#, the algorithm could look like this:

static void Walk(Node node)
{
    Node lastNode = null;
    while (node != null)
    {
        if (lastNode == node.Parent)
        {
            if (node.Left != null)
            {
                lastNode = node;
                node = node.Left;
                continue;
            }
            else
                lastNode = null;
        }
        if (lastNode == node.Left)
        {
            Output(node);

            if (node.Right != null)
            {
                lastNode = node;
                node = node.Right;
                continue;
            }
            else
                lastNode = null;
        }
        if (lastNode == node.Right)
        {
            lastNode = node;
            node = node.Parent;
        }
    }
}

Problem

Is it possible to do an iterative in-order-traversal on a BST whose node has a parent pointer (the parent of the root is `null`) without using a `visited` flag or a `stack`? I googled and didn't find a reply. The point is, how can I know - at a certain node - that I've just come to it vs I've finished everything underneath it?

Original source