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;    }}

学习的道路还很长。。太嫩了,明明是很基础的东西却要参考别人的代码。。我会加油的!

前天送你上飞机,好舍不得你,我已经下决心要去找你了,相信我!~~

0 0
原创粉丝点击