/// <summary> /// Starting from a binary tree node, traverse depth-first by pre-order and perform an action. /// </summary> /// <param name="node">The node to start a traversal.</param> /// <param name="doFuncVisit">The action to perform on the node.</param> public void DepthFirstPreOrderIterative(TNode node, Action <TNode> doFuncVisit) { if (node == null || doFuncVisit == null) { return; } StackGeneric <TNode> stackNodes = new StackGeneric <TNode>(); while (node != null || !stackNodes.IsEmpty) { doFuncVisit(node); if (node.Right != null) { stackNodes.Push(node.Right as TNode); } if (node.Left != null) { stackNodes.Push(node.Left as TNode); } node = stackNodes.Pop(); } }
/// <summary> /// Starting from a binary tree node, traverse depth-first by post-order and perform an action. /// </summary> /// <param name="node">The node to start a traversal.</param> /// <param name="doFuncVisit">The action to perform on the node.</param> public void DepthFirstPostOrderIterative(TNode node, Action <TNode> doFuncVisit) { if (node == null || doFuncVisit == null) { return; } TNode nodeLastVisted = null; StackGeneric <TNode> stackNodes = new StackGeneric <TNode>(); while (node != null || !stackNodes.IsEmpty) { if (node != null) { stackNodes.Push(node); node = node.Left as TNode; } else //// traverse to right { TNode peekNode = stackNodes.Peek(); if (peekNode.Right != null && peekNode.Right != nodeLastVisted) { node = peekNode.Right as TNode; } else { stackNodes.Pop(); doFuncVisit(peekNode); nodeLastVisted = peekNode; } } } }
/// <summary> /// Starting from a binary tree node, traverse depth-first by in-order and add to a sequential list. /// </summary> /// <param name="node">The node to start a traversal.</param> /// <param name="sequentializedTraverseList">The sequential list.</param> public void DepthFirstInOrderIterative(TNode node, List <TNode> sequentializedTraverseList) { if (sequentializedTraverseList == null) { sequentializedTraverseList = new List <TNode>(); } StackGeneric <TNode> stackNodes = new StackGeneric <TNode>(); while (node != null || !stackNodes.IsEmpty) { if (node != null) { stackNodes.Push(node); node = node.Left as TNode; } else //// LIFO vist from the stack { node = stackNodes.Pop(); sequentializedTraverseList.Add(node); node = node.Right as TNode; } } }
/// <summary> /// Starting from a binary tree node, traverse depth-first by in-order and perform an action. /// </summary> /// <param name="node">The node to start a traversal.</param> /// <param name="doFuncVisit">The action to perform on the node.</param> public void DepthFirstInOrderIterative(TNode node, Action <TNode> doFuncVisit) { if (node == null || doFuncVisit == null) { return; } StackGeneric <TNode> stackNodes = new StackGeneric <TNode>(); while (node != null || !stackNodes.IsEmpty) { if (node != null) { stackNodes.Push(node); node = node.Left as TNode; } else //// LIFO vist from the stack { node = stackNodes.Pop(); doFuncVisit(node); node = node.Right as TNode; } } }