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时,顺序相反,应该先压入左子树,再压入右子树。问题就解决啦。
迭代代码:
递归解法的代码如下:
/**
* 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时,顺序相反,应该先压入左子树,再压入右子树。问题就解决啦。
迭代代码:
相关文章推荐
- LeetCode145:Binary Tree Postorder Traversal
- leetcode_145_Binary Tree Postorder Traversal
- leetcode 145 Binary Tree Postorder Traversal C++
- 【LeetCode-145】Binary Tree Postorder Traversal(C++)
- LeetCode 145 Binary Tree Postorder Traversal(二叉树后序遍历)
- leetcode[145] Binary Tree Postorder Traversal
- 145. Binary Tree Postorder Traversal
- 145.Binary Tree Postorder Traversal
- LeetCode 145 Binary Tree Postorder Traversal (后序遍历二叉树)
- [145]Binary Tree Postorder Traversal
- 【leetcode】【145】Binary Tree Postorder Traversal
- Leetcode[145]-Binary Tree Postorder Traversal
- 【LEETCODE】145-Binary Tree Postorder Traversal
- 145.Binary Tree Postorder Traversal
- leetcode_c++:栈: Binary Tree Postorder Traversal(145)
- LeetCode #145 - Binary Tree Postorder Traversal - Hard
- LeetCode 145:Binary Tree Postorder Traversal
- LeetCode 145:Binary Tree Postorder Traversal 解题与思考
- Binary Tree Postorder Traversal leetcode145
- [leetcode 145] Binary Tree Postorder Traversal (待完善)