Given a binary tree, return the postorder traversal of its nodes' values.
Example:
Input:[1,null,2,3]
1 \ 2 / 3 Output:[3,2,1]
Follow up: Recursive solution is trivial, could you do it iteratively?
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
import java.util.List;
import java.util.ArrayList;
import java.util.Stack;
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
if(root == null) return res;
postDfs(root, res);
return res;
}
public void postDfs(TreeNode root, List<Integer> res){
if(root == null) return;
postDfs(root.left, res);
postDfs(root.right, res);
res.add(root.val);
}
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if(root == null) return res;
TreeNode p = root, r = null;
Stack<TreeNode> stack = new Stack<TreeNode>();
while(p != null || !stack.isEmpty()){
if(p != null){ //树左边的元素入栈
stack.push(p);
p = p.left;
}else{
p = stack.peek();
if(p.right != null && p.right != r){ //右子树存在,未被访问
p = p.right;
}else{
stack.pop();
res.add(p.val);
r = p;//记录最近访问过的节点
p = null;//节点访问完后,重置p指针
}
}
}
return res;
}
}
import java.util.List;
import java.util.ArrayList;
import java.util.Stack;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if(root != null){
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
TreeNode cur = null;
while(!stack.isEmpty()){
cur = stack.peek();
if(cur.left != null && root != cur.left && root!=cur.right){
stack.push(cur.left);
}else if(cur.right != null && cur != cur.right){
stack.push(cur.right);
}else{
res.add(stack.pop().val);
root = cur;
}
}
}
return res;
}
}