题目:
二叉树的后序遍历
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].
递归解法:
public List<Integer> postorderTraversal(TreeNode root){
List<Integer> res = new ArrayList<Integer>();
helper(root, res);
return res;
}
private void helper(TreeNode root, List<Integer> res){
if(root == null)
return;
helper(root.left, res);
helper(root.right, res);
res.add(root.val);
}
非递归解法:
public List<Integer> postorderTraversal(TreeNode root){
List<Integer> res = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode pre = null;
while(root != null || !stack.isEmpty()){
if(root != null){
stack.push(root);
root = root.left;
}
else{
TreeNode peek = stack.peek();
// 如果当前栈顶元素的右结点存在并且还没访问过
//(也就是右结点不等于上一个访问结点),那么就把当前结点移到右结点继续循环
if(peek.right != null && pre != peek.right){
root = peek.right;
}
else{
stack.pop();
res.add(peek.val);
pre = peek;
}
}
}
return res;
}