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