您的位置:首页 > 其它

145 Binary Tree Postorder Traversal

2017-03-20 14:53 465 查看
最后一个,后序遍历,postorder

递归解法的代码如下:

/**
* 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> list = new ArrayList<Integer>();
addNode(root, list);
return list;
}

public void addNode(TreeNode root, List<Integer> list){
if(root==null) return;
addNode(root.left, list);
addNode(root.right, list);
list.add(root.val);
}
}

利用之前preorder的相同思路,还是用倒三角的方式来理解,唯一的不同,也是本题的巧妙之处就是:在添加node.val时是要往前面开始添加,利用addFirst这个函数,就是这里解决了postorder中,root放在最后的问题!!相应的,因为result是往前面加元素,那么是先加右子树,然后加左子树,这就是弹出的顺寻。所以在压入stack时,顺序相反,应该先压入左子树,再压入右子树。问题就解决啦。

注意,ArrayList没有addFirst的方法,LinkedList才有

迭代代码:
/**
* 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) {
LinkedList<Integer> result = new LinkedList<>(); // !!! 为了使用addFirst,只能使用LinkedList了
if(root==null) return result;
Stack<TreeNode> stack= new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode visiting = stack.pop();
result.addFirst(visiting.val); // add at first, just like adding in front

// 考虑到addFirst是头插法,同时要考虑postorder,那就要先addFirst(right),那么就先要压入left;
if(visiting.left!=null) stack.push(visiting.left);
if(visiting.right!=null) stack.push(visiting.right); // 然后要压入right
}
return result;
}
}

利用之前preorder的相同思路,还是用倒三角的方式来理解,唯一的不同,也是本题的巧妙之处就是:在添加node.val时是要往前面开始添加,利用addFirst这个函数,就是这里解决了postorder中,root放在最后的问题!!相应的,因为result是往前面加元素,那么是先加右子树,然后加左子树,这就是弹出的顺寻。所以在压入stack时,顺序相反,应该先压入左子树,再压入右子树。问题就解决啦。

迭代代码:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: