61 按之字型顺序打印二叉树

题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

第一行,按顺序打印;第二行,先放入一个栈中,然后取出再打印;第三行按顺序打印,如此继续;需要一个标记来判断是不是使用栈来存储(为了反序)。基础是按层遍历,使用last和nlast来判断是不是要换行了。

public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> arrayList = new ArrayList(); 
        if(pRoot == null)
            return arrayList;
        Queue<TreeNode> queue = new LinkedList();

        ArrayList<Integer> list = new ArrayList(); 
        Stack<TreeNode> stack = new Stack();

        TreeNode last = pRoot;
        TreeNode nlast = null;
        boolean isStack = false;        

        queue.offer(pRoot);
        while(!queue.isEmpty()){
            TreeNode cur = queue.poll();

            if(cur.left != null){
                queue.offer(cur.left);
                nlast = cur.left;
            }
            if(cur.right != null){
                queue.offer(cur.right);
                nlast = cur.right;
            }

            if(!isStack)//无论当前是不是当前行的最后一个,都得存入
                list.add(cur.val);
            else
                stack.push(cur); 

            if(cur == last){
                if(!isStack){
                    arrayList.add(list);
                    list = new ArrayList(); 
                    isStack = true;
                }else{
                    while(!stack.isEmpty()){
                        TreeNode t = stack.pop();
                        list.add(t.val);                        
                    }
                    arrayList.add(list);
                    list = new ArrayList(); 
                    isStack = false;
                }
                last = nlast;
            }                       
        }
        return arrayList;
    }

}

小错误:
(1)栈不为null
(2)就算last == cur的时候,也得add操作
(3)last的变换
(4)有点存储的是节点,有的是val

猜你喜欢

转载自blog.csdn.net/xuchonghao/article/details/80520227
61
今日推荐