思路:如果按照後序遍歷將節點放入list,什麼時候當前節點可以放入list?當左右子節點都爲空或者左右子節點都已經放入list的時候,左右子節點都已經放入list又可以分情況討論進行簡化
1右節點爲空,左節點放入list
2左節點爲空,右節點放入list
3左右節點都放入list
情況三,因爲是後序遍歷,當右節點放入list時左節點已經放入了list,所以簡化成右節點放入list
最後判斷條件變爲
if(current.left==head||current.right==head||(current.left==null&¤t.right==null))
代碼如下:
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
/**
* Created by marsares on 15/6/14.
*/
public class BinaryTreePostorderTraversal {
public List<Integer> postorderTraversal(TreeNode root) {
if(root==null)return new LinkedList<Integer>();
List<Integer>list=new LinkedList<Integer>();
Stack<TreeNode> stack=new Stack<TreeNode>();
stack.add(root);
TreeNode current=null;
TreeNode head=root;
while(!stack.empty()){
current=stack.peek();
if(current.left==head||current.right==head||(current.left==null&¤t.right==null)){
stack.pop();
list.add(current.val);
head=current;
}else{
if(current.right!=null)stack.push(current.right);
if(current.left!=null)stack.push(current.left);
}
}
return list;
}
public void printList(List<Integer>list){
System.out.print("[");
for(int i=0;i<list.size()-1;i++){
System.out.print(list.get(i)+",");
}
System.out.println(list.get(list.size()-1)+"]");
}
public static void main(String[]args){
BinaryTreePostorderTraversal btpt=new BinaryTreePostorderTraversal();
BinaryTreeSerialize sts=new BinaryTreeSerialize();
TreeNode root=sts.Unserialize("{3,9,20,#,#,15,7}");
btpt.printList(btpt.postorderTraversal(root));
}
}