1. 题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
2. 题目分析
- 非常经典的一道二叉树的题目,做这道题之前需要掌握二叉树的思想和BFS(广度优先搜索、队列思想)
- 我们可以回顾一下最基本的层次遍历,我们是用一个队列来进行存储初始root结点,然后依次放入root的左子树和右子树,循环上述操作
while (!queue.isEmpty()) {
TreeNode treeNode = queue.poll();
if (treeNode.left != null) {
queue.add(treeNode.left);
}
if (treeNode.right != null) {
queue.add(treeNode.right);
}
}
- 对于这道题,我们需要分层,所以我们需要考虑,怎么让一层的数字输出在同一list中,当我们把root放入队列时,目前的队列长度为1,我们按照队列的长度来进行循环
queue.add(treeNode.left);
queue.add(treeNode.right);
,目前队列中的长度为2,我们继续按照队列的长度进行循环,依次来遍历还整个二叉树。
3. 题目代码
public class Solution {
ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
if (pRoot == null) {
return list;
}
queue.offer(pRoot);
while (!queue.isEmpty()) {
ArrayList<Integer> list2 = new ArrayList<>();
for (int i = queue.size(); i > 0; i--) {
TreeNode treeNode = queue.poll();
list2.add(treeNode.val);
if (treeNode.left != null) {
queue.offer(treeNode.left);
}
if (treeNode.right != null) {
queue.offer(treeNode.right);
}
}
list.add(list2);
}
return list;
}
}