题目描述:

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

解题思路:

参考链接:队列先了解一下队列的知识:
队列是一种常用数据结构,有先入先出的性质。
java中用Queue来表示队列。Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Deque接口。
常用方法:
add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
offer 添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返问队列头部的元素 如果队列为空,则返回null
element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
peek 返回队列头部的元素 如果队列为空,则返回null
put 添加一个元素 如果队列满,则阻塞
take 移除并返回队列头部的元素 如果队列为空,则阻塞
size() 返回队列中元素的个数

做这个题的核心思想:每次出队一个元素,就将该元素的孩子节点加入队列中,直至队列中元素个数为0时,出队的顺序就是该二叉树的层次遍历结果。

可以画图一步一步执行代码来理解

普通的从上到下打印二叉树:

TreeNode

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

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

    }
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
        ArrayList<Integer> list=new ArrayList<>();
        if(root==null)
            return list;
        Queue<TreeNode> queue=new LinkedList<>();
        queue.offer(root);//添加一个元素并返回true 如果队列已满,则返回false
        while (!queue.isEmpty())
        {
            TreeNode temp=queue.poll();//移除并返问队列头部的元素 如果队列为空,则返回null
            list.add(temp.val);//给list赋值用.val
            if(temp.left!=null) queue.offer(temp.left);//添加一个元素并返回true 如果队列已满,则返回false
            if(temp.right!=null) queue.offer(temp.right);//添加一个元素并返回true 如果队列已满,则返回false

        }
        return list;
    }

但这道题返回类型是ArrayList<ArrayList>,因此在循环中,在多加一层循环,int size=queue.size();获取一下元素个数,然后循环在添加进list。

ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> thelist=new ArrayList<>();
        if(pRoot==null) return thelist;
        Queue<TreeNode> queue=new LinkedList<>();
        queue.offer(pRoot);//添加一个元素并返回true 如果队列已满,则返回false
        while (!queue.isEmpty())
        {
            ArrayList<Integer> list=new ArrayList<>();
            int size=queue.size();//重点
            for (int i = 0; i < size; i++) {
                TreeNode temp=queue.poll();//移除并返问队列头部的元素 如果队列为空,则返回null
                list.add(temp.val);
                if(temp.left!=null) queue.offer(temp.left);//添加一个元素并返回true 如果队列已满,则返回false
                if(temp.right!=null) queue.offer(temp.right);//添加一个元素并返回true 如果队列已满,则返回false
            }
            thelist.add(list);
        }
        return thelist;

    }

建议多复习,基础!!!