您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: