原题链接在这里:https://leetcode.com/problems/binary-tree-postorder-traversal/
与Binary Tree Preorder Traversal 和 Binary Tree Inorder Traversal 类似。
Method 1: Recursion
Time O(n), Space O(logn)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
//Method 1: Recursion
public List<Integer> postorderTraversal(TreeNode root) {
//Recursion
List<Integer> ls = new ArrayList<Integer>();
helper(root,ls);
return ls;
}
private void helper(TreeNode root,List<Integer> ls){
if(root == null){
return;
}
helper(root.left,ls);
helper(root.right,ls);
ls.add(root.val);
}
}
Method 2: Iteration + Stack
和Preorder, Inorder 类似,不同的地方在于出栈多加了条件. 加了节点pre用来记载刚刚加入ls的点。
当top.right != null 并且top.right !=pre (top.right == pre 说明right已经加入ls里了),root = root.right压进栈内。
AC Java:
//Method 2: Iteration
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> ls = new ArrayList<Integer>();
Stack<TreeNode> stk = new Stack<TreeNode>();
TreeNode pre = null;
while(root != null || !stk.empty()){
if(root != null){
stk.push(root);
root = root.left;
}else{
TreeNode top = stk.peek();
if(top.right!=null && top.right != pre){
root = top.right;
}else{
ls.add(top.val);
stk.pop();
pre = top;
}
}
}
return ls;
}