按之字形顺序打印二叉树,利用层次遍历(广度优先遍历的思想)


/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/

import   java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        //队列(先进先出)
        LinkedList<TreeNode>  queue=new  LinkedList<TreeNode>();
        //存放结果
        ArrayList<ArrayList<Integer>>  result=new  ArrayList<>();
        //判断头结点是否为null
        if(pRoot==null){
            return result;
        }
        //将节点放入队列中
        queue.add(pRoot);
        //标志位(改变List结合中添加元素的顺序)
        Boolean  blog=true;
        //当队列不为空时,遍历输出结点
        while(!queue.isEmpty()){
            //计算出当前循环,队列中元素的数目
            int size=queue.size();
            //存放当前层的元素(根据标志位blog)
            ArrayList<Integer>  branchResult=new  ArrayList<Integer>();
            //将当前层的元素依次弹出队列,并把它的不为空的左右子节点加入队列
            while(size>0){
                //当前层元素依次弹出队列
                TreeNode node=queue.poll();
                //根据标志位blog将当前层元素放入branchResult集合中
                if(blog){
                    branchResult.add(node.val);
                }else{
                    //每次都将元素放入索引为0的位置,原来的元素依次后移
                    branchResult.add(0,node.val);
                }
                //左结点存在则入队
                if(node.left!=null){
                    queue.add(node.left);
                }
                //右节点存在则入队
                if(node.right!=null){
                    queue.add(node.right);
                }
                //记录当前循环还剩的元素个数
                size--;
            }
            //将当前层的元素放入result集合中
            result.add(branchResult);
            //每循环一次,就改变标志位的状态
            blog=!blog;
        }
        //返回结果
        return result;
    }

}