您的位置:首页 > 其它

LeetCode 145. Binary Tree Postorder Traversal(二叉树后序遍历)

2016-05-26 01:31 363 查看
原题网址:https://leetcode.com/problems/binary-tree-postorder-traversal/

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?
方法一:用栈模拟递归过程。

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> traversal = new ArrayList<>();
Stack<TreeNode> nodes = new Stack<>();
Stack<Integer> states = new Stack<>();
nodes.push(root);
states.push(1);
while (!nodes.isEmpty()) {
TreeNode node = nodes.pop();
int state = states.pop();
if (node == null) continue;
if (state == 1) {
nodes.push(node);
states.push(2);
nodes.push(node.left);
states.push(1);
continue;
} else if (state == 2) {
nodes.push(node);
states.push(3);
nodes.push(node.right);
states.push(1);
continue;
} else if (state == 3) {
traversal.add(node.val);
continue;
}
}
return traversal;
}
}


方法二:使用prev指针保存遍历顺序,只要能够区分目前是从上往下还是从下往上即可。

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> traversal = new ArrayList<>();
if (root == null) return traversal;
Stack<TreeNode> nodes = new Stack<>();
nodes.push(root);
TreeNode prev = null;
while (!nodes.isEmpty()) {
TreeNode node = nodes.pop();
if (prev == null
|| prev.left == node
|| (!nodes.isEmpty() && nodes.peek().left == prev && nodes.peek().right == node)
|| (!nodes.isEmpty() && nodes.peek().left == null && prev.right == node)) {
nodes.push(node);
if (node.right != null) nodes.push(node.right);
if (node.left != null) nodes.push(node.left);
} else {
traversal.add(node.val);
}
prev = node;
}
return traversal;
}
}


另一种更简洁的实现:

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
if (root == null) return result;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
TreeNode prev = null;
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if ((node.left == null && node.right == null)
|| (prev != null && (node.left == prev || node.right == prev))) {
result.add(node.val);
} else {
stack.push(node);
if (node.right != null) stack.push(node.right);
if (node.left != null) stack.push(node.left);
}
prev = node;
}
return result;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: