Post Order traverse binary tree using non-recursive way
Process analysis

- Stack = 5,
- Push 3, Stack = 5, 3. Pre = 5
- Current = 3, Pre = 5, Push 2 to the stack, stack = 5, 3, 2, Pre = 3
- Current = 2, Pre = 3, pop 2, PRINT 2, Stack = 5, 3. Pre = 2
- Current = 3, push 4, Stack = 5, 3 , 4. Pre = 3
- Current = 4, 4 is leaf node, pop 4. PRINT 4, Pre = 4, Stack = 5, 3
- 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
- Current = 5, Pre = 3, 5 has right child, push 7, Stack = 5, 7, Pre = 5
- 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
- Current = 6, 6 is 7's left child, but 6 is leaf node, pop 6. Print 6, Pre = 6. Stack = 5, 7
- Current = 7, 7 has right child? yes, 8. Push 8 to the stack, Stack = 5,7,8. Pre = 7
- Current = 8, 8 has no left child, has right child 10, push 10 to the stack. Stack = 5, 7, 8, 10. Pre = 8
- Current = 10, 10 is leaf node, pop 10, Print 10, Stack = 5,7,8, Pre = 10
- Current = 8, pop 8, Print 8, Stack = 5, 7, Pre = 8
- Current = 7, pop 7, Print 7, Stack = 5, Pre = 7
- 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的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- Morris InOrder Traverse Binary Tree 无需使用递归和栈
今天在切leetcode的时候看到一个Morris算法,用来中序遍历二叉树,非递归,O(1)空间.觉得很强大.记录一下. 基本思想是利用了Threaded Binary Tree. 步骤如下: cur ...
- 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 ...
随机推荐
- jQuery 查找元素2
jQuery 查找元素2 :first <ul> <li>list item 1</li> <li>list item 2</li> < ...
- yum无法安装的pdksh
yum无法安装的pdksh,本地pdksh-5.2.14-37.el5_8.1.x86_64.rar,点击下载.
- 来自docker的嚎叫
好吧, 这是我第二次玩这个玩意了, 其实我现在这家公司是没有接触到docker的, 因此对它也是半桶水的状态, 之前有朋友叫我写过shell去离线部署它, 部署都那样不值一提, 后来到我第二次去接触它 ...
- Guitar Pro里自动化编辑器有什么用?如何使用?
我们在使用操作Guitar Pro来进行吉他学习创作时,会遇到下面几个问题.当我们想要改变全部小节或者某一特定小节的拍速时,就会在想,有没有什么简便工具来实现我们的想法呢?告诉大家,Guitar Pr ...
- TCP 基础知识
参考 朱小厮-一文详解TCP 博客园-"三次握手,四次挥手"你真的懂吗? 博客园-深度解密HTTP通信细节
- 遗留系统如何用DDD重构(未完,待续)
GETTING DDD STARTED SURROUNDED BY LEGACY SYSTEMS ByEric Evans
- CentOS7.4安装jdk1.8.0_201、Tomcat-8.5.38环境
有时候安装一些软件或者服务都需要jdk环境,今天就在centos1.4上安装最新的jdk环境. 检测历时安装 1.查看Linux自带的JDK是否已安装 # java -version 2.查看JDK信 ...
- Spring Boot系列一:默认日志logback配置解析
前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式以及输出方式如何配置? 代码中如何使用? 正文 Sp ...
- SpringBoot与数据访问
pom依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(me
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(me ...