public static IEnumerator<DecisionNode> PostOrder(DecisionNode tree)
{
var cursor = new Dictionary<DecisionNode, int>();
DecisionNode currentNode = tree;
while (currentNode != null)
{
// Move down to first child
DecisionNode nextNode = null;
if (currentNode.Branches != null)
nextNode = currentNode.Branches.FirstOrDefault();
if (nextNode != null)
{
currentNode = nextNode;
continue;
}
// No child nodes, so walk tree
while (currentNode != null)
{
yield return currentNode; // post order
// Move to sibling if possible.
nextNode = GetNextSibling(cursor, currentNode);
if (nextNode != null)
{
currentNode = nextNode;
break;
}
// Move up
if (currentNode == nextNode)
currentNode = null;
else
currentNode = currentNode.Parent;
}
}
}
}