题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
题目分析
1:与BFS有关。
2:左右的不同顺序可以用两个栈来存储。一个栈存储左到右的,一个存储右到左的。
3:在pop时,直接将val存储进list
代码

    public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();//返回值设置
        ArrayList<Integer> list;//每一层的返回
        if(pRoot == null) return res;
        Stack<TreeNode> sLeft = new Stack<>();
        Stack<TreeNode> sRight = new Stack<>();
        boolean LTR = true;  // 判断变量,判断是左-右还是右-左
        sRight.push(pRoot);    //第一行是左-右,加入sRight栈,弹出顺序相反,即左-右加入到list中
        TreeNode cur;
        while(!sLeft.isEmpty() || !sRight.isEmpty()){
            list = new ArrayList<>();
            if(LTR){ //这一行为从左到右
                while(!sRight.isEmpty()){ //上一层的栈为空时退出
                    cur = sRight.pop();
                    list.add(cur.val);//list按弹出顺序加入值。
//这一层左到右,下一层就是右到左,在栈的顺序就是左到右,先加左儿子再右儿子
                    if(cur.left != null){
                        sLeft.push(cur.left);
                    }
                    if(cur.right != null){
                        sLeft.push(cur.right);
                    }
                }
            }else{  // 如果相反  都相反。注意左右儿子添加的顺序
                while(!sLeft.isEmpty()){
                    cur = sLeft.pop();
                    list.add(cur.val);
                    if(cur.right != null){
                        sRight.push(cur.right);
                    }
                    if(cur.left != null){
                        sRight.push(cur.left);
                    }
                }
            }
            LTR = !LTR; //更新
            res.add(list);
        }
        return res;
    }