LeetCode 145 Binary Tree Postorder Traversal
2015-12-01 23:12
369 查看
题目描述
Given a binary tree, return the postorder traversal of its nodes’ values.For example:
Given binary tree {1,#,2,3},
[code] 1 \ 2 / 3
return [3,2,1].
Note: Recursive solution is trivial, could you do it iteratively?
分析
后序遍历比前序遍历、中序遍历复杂一些,主要体现在判断一个结点出栈时,如果是第一次出栈,则还需入栈。因为后序遍历是“左右中”的顺序。可以给每个结点增加一个布尔值,用来判断是否是第一次出栈。可以定义如下的数据结构:
[code] public static class PostTreeNode { TreeNode node; boolean first; }
其中first用来判断是否是第一次出栈。
代码
[code] public static class PostTreeNode { TreeNode node; boolean first; }
public static List<Integer> postorderTraversal(TreeNode root) {
List<Integer> rt = new ArrayList<Integer>();
if (root == null) {
return rt;
}
Stack<PostTreeNode> stack = new Stack<PostTreeNode>();
TreeNode p = root;
PostTreeNode t;
while (p != null || !stack.empty()) {
while (p != null) {
// 新建一个结点,这个结点包含一个布尔值first
// 用来判断是否是第一次入栈
PostTreeNode post = new PostTreeNode();
post.node = p;
post.first = true;
stack.push(post);
p = p.left;
}
if (!stack.empty()) {
t = stack.pop();
// 如果结点第一次出栈,再次入栈,将first置为false
if (t.first == true) {
t.first = false;
stack.push(t);
p = t.node.right;
} else {
rt.add(t.node.val);
p = null;
}
}
}
return rt;
}
相关文章推荐
- ReentrantLock中的方法
- 搭建 tty.js:一款基于浏览器的终端模拟器
- 用jQuery向div中添加Html文本内容
- Android MVC、MVP架构
- php
- solrj for solr5.3.1(solrj最新版本API)
- C——提高(1)
- SpringMVC_参数绑定1
- Android Speex编译及使用
- 理解C语言——从小菜到大神的晋级之路(1)——引言:C语言的前世今生
- 局域网 和 广域网(内网和外网)
- 内存管理算法--Buddy伙伴算法
- java如何快速实现深copy
- springmvc源码心得之handler及handlerAdapter设计
- LeetCode Flatten Binary Tree to Linked List
- node.js初学(一)
- poj 3311 floyd + 状态
- 小试Unity中OBJ和Scene打包Bundle与加载--wondows平台下
- Jquery为DIV添加点击事件,Jquery为a标签超链接添加点击事件
- ReentrantLock的使用和Condition