题目描述:
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
解题思路:
参考链接:队列先了解一下队列的知识:
队列是一种常用数据结构,有先入先出的性质。
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;
}
建议多复习,基础!!!