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]
.
Note: Recursive solution is trivial, could you do it iteratively?
Recursice:
import java.util.ArrayList;
import java.util.List;
public class Solution {
public void postorder(TreeNode root, List<Integer> list){
if( root == null )
return;
postorder(root.left,list);
postorder(root.right, list);
list.add(root.val);
}
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
postorder(root, list);
return list;
}
}
Iterative:
思路:
其实我们希望栈中保存的从顶部依次是root->left, root->right, root,当符合上面提到的条件时,就进行出栈操作。有一种巧妙的方法可以做到,先上代码
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
if( root == null )
return list;
LinkedList<TreeNode> stack = new LinkedList<TreeNode>();
TreeNode p= root;
stack.push(p);
stack.push(p);
while( !stack.isEmpty() ){
p = stack.getFirst();
p = stack.pop();
if( !stack.isEmpty() && p == stack.getFirst() ){
if( p.right != null ){
stack.push(p.right);
stack.push(p.right);
}
if( p.left != null ){
stack.push(p.left);
stack.push(p.left);
}
}else{
list.add(p.val);
}
}
return list;
}
}
对于每个节点,都压入两遍,在循环体中,每次弹出一个节点赋给p,如果p仍然等于栈的头结点,说明p的孩子们还没有被操作过,应该把它的孩子们加入栈中,否则,访问p。也就是说,第一次弹出,将p的孩子压入栈中,第二次弹出,访问p。
参考链接:
http://www.cnblogs.com/rain-lei/p/3705680.html