Process analysis

    

  1. Stack = 5,  
  2. Push 3, Stack = 5, 3.    Pre = 5
  3. Current = 3, Pre = 5, Push 2 to the stack, stack = 5, 3, 2, Pre = 3
  4. Current = 2, Pre = 3, pop 2, PRINT 2, Stack = 5, 3.  Pre = 2
  5. Current = 3, push 4, Stack = 5, 3 , 4.  Pre = 3
  6. Current = 4,  4 is leaf node, pop 4.  PRINT 4, Pre = 4, Stack = 5, 3
  7. Current = 3, Pre = 4, 4 is right child of 3, it means it goes up from right side, all visited.  Pop one more element from stack, PRINT 3.  Pre = 3.  Stack = 5
  8. Current = 5, Pre = 3, 5 has right child, push 7, Stack = 5, 7, Pre = 5
  9. Current 7, which is right child of 5, meaning it's first time to visit 7, 7 has left child, push 6 to the stack.  Stack = 5, 7, 6    Pre = 7
  10. Current = 6, 6 is 7's left child, but 6 is leaf node, pop 6.  Print 6, Pre = 6. Stack = 5, 7
  11. Current = 7, 7 has right child?  yes, 8. Push 8 to the stack, Stack = 5,7,8.  Pre = 7
  12. Current = 8, 8 has no left child, has right child 10, push 10 to the stack.  Stack = 5, 7, 8, 10.  Pre = 8
  13. Current = 10, 10 is leaf node, pop 10, Print 10, Stack = 5,7,8, Pre = 10
  14. Current = 8, pop 8, Print 8, Stack = 5, 7, Pre = 8
  15. Current = 7, pop 7, Print 7, Stack = 5, Pre = 7
  16. Current = 5, pop 5, Print 5,  stack = empty
 public void PostOrderNonRecursion1StackV1()
{
Stack<TreeNode<T>> stack = new Stack<TreeNode<T>>(); if (root == null)
{
return;
} TreeNode<T> current = this.root;
TreeNode<T> pre = null; stack.Push(this.root); while (stack.Count != )
{
current = stack.Peek(); // top down
if (pre == null || pre.leftChild == current || pre.rightChild == current)
{
if (current.leftChild != null)
{
stack.Push(current.leftChild);
}
else if (current.rightChild != null)
{
stack.Push(current.rightChild);
}
else
{
// leaf node, have to pop
Console.WriteLine("visit node {0}", stack.Pop().data);
}
}
// move up case from left node
else if (current.leftChild == pre)
{
if (current.rightChild != null)
{
stack.Push(current.rightChild);
}
else
{
Console.WriteLine("visit node {0}", stack.Pop().data);
}
}
// move up from right , which means all done, need pop up next one to figure out next action
else if (current.rightChild == pre)
{
Console.WriteLine("visit node {0}", stack.Pop().data);
} // remember the previous node, not parent node
pre = current;
}
}

The solution above uses one stack.  If you use two stacks, there are the following two ways.

Solution 1 - do pre-order non-recursive firstly, but the sequence is root, right, left, not root, left and right.

Then store the result in stack 2, print stack 2, you will get the final result.  Put code as below.

 public void PostOrderNonRecursion2StacksV1()
{
Stack<TreeNode<T>> stack1 = new Stack<TreeNode<T>>();
Stack<TreeNode<T>> stack2 = new Stack<TreeNode<T>>(); TreeNode<T> current = root; if (current == null)
{
return;
} while (current != null)
{
stack2.Push(current);
Console.WriteLine(current.data);
stack1.Push(current);
current = current.rightChild;
} while (stack1.Count != )
{
current = stack1.Pop(); if (current.leftChild != null)
{
current = current.leftChild;
while (current != null)
{
stack2.Push(current);
stack1.Push(current);
current = current.rightChild;
}
}
} while (stack2.Count != )
{
Console.WriteLine("value = {0}", stack2.Pop().data);
}
}

Solution 2:

这个方法对于初学者很难想到,根节点先入栈,然后根节点出栈,存入栈2.  根节点的左孩子入栈,根节点的右孩子入栈。

然后右孩子出栈,入栈2. 右孩子的左右节点入栈1。这样栈2的元素实际从底往上是主根,右孩子,递归右左。  反过来就是先左后右, 再根节点。  下面是代码

  public void PostOrderNonRecursion2StackV2()
{
Stack<TreeNode<T>> stack1 = new Stack<TreeNode<T>>();
Stack<TreeNode<T>> stack2 = new Stack<TreeNode<T>>(); TreeNode<T> current = root;
if (current == null)
{
return;
} stack1.Push(current); while (stack1.Count != )
{
current = stack1.Pop();
if (current.leftChild != null)
{
stack1.Push(current.leftChild);
} if (current.rightChild != null)
{
stack1.Push(current.rightChild);
} stack2.Push(current);
} while (stack2.Count != )
{
Console.WriteLine("value = {0}", stack2.Pop().data);
}
}

Post Order traverse binary tree using non-recursive way的更多相关文章

  1. Binary Tree Level Order Traversal,Binary Tree Level Order Traversal II

    Binary Tree Level Order Traversal Total Accepted: 79463 Total Submissions: 259292 Difficulty: Easy G ...

  2. 37. Binary Tree Zigzag Level Order Traversal && Binary Tree Inorder Traversal

    Binary Tree Zigzag Level Order Traversal Given a binary tree, return the zigzag level order traversa ...

  3. CSharp Algorithm - How to traverse binary tree by breadth (Part II)

    /* Author: Jiangong SUN */ Here I will introduce the breadth first traversal of binary tree. The pri ...

  4. 35. Binary Tree Level Order Traversal && Binary Tree Level Order Traversal II

    Binary Tree Level Order Traversal OJ: https://oj.leetcode.com/problems/binary-tree-level-order-trave ...

  5. LeetCode: Binary Tree Level Order Traversal && Binary Tree Zigzag Level Order Traversal

    Title: Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to ...

  6. LeetCode之“树”:Binary Tree Level Order Traversal && Binary Tree Level Order Traversal II

    Binary Tree Level Order Traversal 题目链接 题目要求: Given a binary tree, return the level order traversal o ...

  7. LeetCode解题报告—— Unique Binary Search Trees & Binary Tree Level Order Traversal & Binary Tree Zigzag Level Order Traversal

    1. Unique Binary Search Trees Given n, how many structurally unique BST's (binary search trees) that ...

  8. Morris InOrder Traverse Binary Tree 无需使用递归和栈

    今天在切leetcode的时候看到一个Morris算法,用来中序遍历二叉树,非递归,O(1)空间.觉得很强大.记录一下. 基本思想是利用了Threaded Binary Tree. 步骤如下: cur ...

  9. programming review (c++): (2)binary tree, BFS, DFS, recursive, non-recursive

    1.二叉树定义 // Definition for a binary tree node. struct TreeNode { int val; TreeNode *left; TreeNode *r ...

随机推荐

  1. mac 遇到的奇怪问题?

    1: 卸载 xcode,发现git报错了. mac git xcrun error active developer path 错误 解决办法:sudo xcode-select -switch / ...

  2. [c/c++] programming之路(12)、循环结构

    一.求2n #include<stdio.h> void main(){ ; ; while(n--){ s*=; printf("%d,%d\n",s,n); } g ...

  3. 最短路径之Bellman-Ford——解决负权边

    Bellman-Ford算法非常简单,核心代码四行,可以完美的解决带有负权边的图. for(k=1;k<=n-1;k++) //外循环循环n-1次,n为顶点个数 for(i=1;i<=m; ...

  4. 分类统计的controller和service

    SpringMVC框架下的 部分代码: Controller控制器: @Resource ReviewTitleService reviewTitleService;//调用ReviewTitleSe ...

  5. pip使用豆瓣的镜像源

    豆瓣镜像地址:https://pypi.douban.com/simple/ 虽然用easy_install和pip来安装第三方库很方便 它们的原理其实就是从Python的官方源pypi.python ...

  6. Learning-MySQL【6】:视图、触发器、存储过程、函数、流程控制

    一.视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的直接使用即可.使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的 SQL 语句了 ...

  7. url接收传参

    下面是接收传参的代码: 方法一: function getQueryString(name) { var reg = new RegExp("(^|&)" + name + ...

  8. 日常英语---八、REBOOT - What is the difference? -MapleStory

    日常英语---八.REBOOT - What is the difference? -MapleStory 一.总结 一句话总结: trade transfer drop_rate equipment ...

  9. pycharm鸡火

    由于github被封杀,大虾把它挪到了gitee下面 /pengzhile/jetbrains-agent 主要是一个jar包,放在D:\Program Files\JetBrains\PyCharm ...

  10. Windows 2003 Server R2 x64 IIS6.0 eWebEditor无法显示的问题

    64位的操作系统安装成功后,一般IIS也是默认的64位的解析,所以将程序放到64位操作系统上的时候,会出现IIS错误,解决方案也非常简单,将64位IIS停止,启动32位的就可以了. 输入以下命令启用 ...