好久没来写了,但是我没有停下来啊~~
不多说了直接开始正文~
题目如下:
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.youkuaiyun.com/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;
}
}
学习的道路还很长。。太嫩了,明明是很基础的东西却要参考别人的代码。。我会加油的!
前天送你上飞机,好舍不得你,我已经下决心要去找你了,相信我!~~