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));
    }
}


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