leetcode--BinaryTreePostorderTraversal

思路:如果按照後序遍歷將節點放入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));
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章