Binary Tree Postorder Traversal
来源:互联网 发布:淘宝网查机票 编辑:程序博客网 时间:2024/06/15 19:15
好久没来写了,但是我没有停下来啊~~
不多说了直接开始正文~
题目如下:
Given a binary tree, return the postorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 \ 2 / 3
return [3,2,1]
.
Note: Recursive solution is trivial, could you do it iteratively?
题目很好理解,即二叉树的后序遍历,有递归和非递归两种方法。递归很容易,不再赘述,代码如下:
public class Solution { List<Integer> result = new ArrayList<Integer>(); public List<Integer> postorderTraversal(TreeNode root) { if(root == null) { return result; } postorderTraversal(root.left); postorderTraversal(root.right); result.add(root.val); return result; }}
下面说说非递归算法。
代码参考了http://blog.csdn.net/hackbuteer1/article/details/6583988,几乎一样。。因为总是写不对。。所以。。。。
二叉树后序遍历的非递归算法我们很容易就可以想到使用栈,但是由于先要访问根节点的左右孩子最后在去访问根节点,所以这就变得麻烦一些。大体上的思路就是如果当前节点不为空,则将其左孩子入栈,重复此过程直到当前节点为空,此时就需要考虑之前最后一个入栈的节点是否为叶子节点:如果其右孩子不为空且没有入过栈,则将其右孩子入栈,继续重复之前的过程;如果右孩子为空或右孩子已经入过栈,则应该将该节点出栈,记录下值并将其作为最后访问的一个节点pre,用来标记该节点已经入过栈,方便在下一次循环中进行判断(因为后序遍历的右孩子出栈时说明根节点的左子树都已经遍历完,所以会一直连续出栈直到某个节点的右孩子还没有入栈,所以这就需要一个标记用来记录该节点是否已经入过栈,防止重复入栈)。代码如下:
public class Solution { public List<Integer> postorderTraversal(TreeNode root) { List<Integer> result = new ArrayList<Integer>(); TreeNode node = root; TreeNode pre = null; Stack<TreeNode> stack = new Stack<TreeNode>(); while(node != null || !stack.empty()) { if(node != null) { stack.push(node); node = node.left; continue; } node = stack.peek(); if(node.right == null || node.right == pre) { result.add(node.val); pre = node; stack.pop(); node = null; } else node = node.right; } return result; }}
学习的道路还很长。。太嫩了,明明是很基础的东西却要参考别人的代码。。我会加油的!
前天送你上飞机,好舍不得你,我已经下决心要去找你了,相信我!~~
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- BUG:android真机调试 opendir failed, Peermission denied
- 将django的HTTP响应保存为excel
- GIT和SVN之间的五个基本区别
- arm平台搭建vsftpd服务
- Struts2.ActionSupport
- Binary Tree Postorder Traversal
- coccos2dx环境配置(android)
- 数据挖掘与数据分析好书推荐
- 【树状数组(BIT)】
- 正则表达式
- FTP SFTP TFTP的区别
- 9 basic principles of responsive web design
- 算法——排序之冒泡排序
- Linux内核的idle进程分析