本题考查树的 BFS.BFS就是一层一层的遍历,我们用队列实现。一个队列的话我们没有层次的限制,直到这个队列为空,说明我们遍历完了。但是现在我们要记录下每一层的节点。相当于问题转为给定一棵二叉树,麻烦打印一下第n层的所有节点。所以为了让每一层都有明显的分开,我们用两个队列来实现互相保存。 之字形的话无非就是要将其中一个队列反转一下顺序。

可读性来了:


public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
    ArrayList<ArrayList<Integer>> res=new ArrayList<>();
    LinkedList<TreeNode> list1=new  LinkedList<>();
    LinkedList<TreeNode> list2=new  LinkedList<>();
    if(pRoot==null){
        return res;
    }
    list1.add(pRoot);
    while(!list1.isEmpty() || !list2.isEmpty()){ //循环交替互相保存遍历的节点
        if(!list1.isEmpty()){ //取出我们要的 val
            printTreeNode(res,list1,0);
        }
        while(!list1.isEmpty()){ //遍历下一层
            addList(list1,list2);
        }
        if(!list2.isEmpty()){ //取出我们要的 val
            printTreeNode(res,list2,1); 
        }
        while(!list2.isEmpty()){ //遍历下一层
            addList(list2,list1);
        }
    }
    return res;
}

public void printTreeNode(ArrayList<ArrayList<Integer>> res,LinkedList<TreeNode> list,int mode){ //好就不写代码了,原来还有 .reverse()方法,就不用遍历了
    ArrayList<Integer> listNums=new ArrayList<>();
    if(mode==0){
        for(TreeNode root:list){
            listNums.add(root.val);
        }
    }else{
        for(int i=list.size()-1;i>=0;i--){
            listNums.add(list.get(i).val);
        }
    }
    res.add(listNums);
    return ;
}


public void addList(LinkedList<TreeNode> list1,LinkedList<TreeNode> list2){
    TreeNode root=list1.removeFirst();
    if(root.left!=null){
        list2.add(root.left);
    }
    if(root.right!=null){
        list2.add(root.right);
    }
}