题目描述
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [3,9,20,null,null,15,7],3
/ \
9 20
/ \
15 7
返回其层次遍历结果:[
[3],
[9,20],
[15,7]
]
提示:节点总数 <= 1000
参考解题思路:思路与层序遍历二叉树I基本类似,利用队列先进先出的特性,广度优先遍历将节点放入队列,while循环中,利用deque.size()为for循环每层节点数量为开始,内部追加时也不会影响大小。
- 特例处理: 当根节点为空,则返回空列表 [] ;
- 初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;
- BFS 循环: 当队列 queue 为空时跳出;
- 新建一个临时列表 tmp ,用于存储当前层打印结果;
- 当前层打印循环: 循环次数为当前层节点数(即队列 queue 长度);
- 出队: 队首元素出队,记为 node;
- 打印: 将 node.val 添加至 tmp 尾部;
- 添加子节点: 若 node 的左(右)子节点不为空,则将左(右)子节点加入队列 queue ;
- 将当前层结果 tmp 添加入 res 。
- 返回值: 返回打印结果列表 res 即可。
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> array = new ArrayList<>();
Deque<TreeNode> deque = new LinkedList<>();
// root不为空队列追加root
if (root != null) {
deque.offer(root);
}
while (!deque.isEmpty()) {
// 每层定义新的List存放节点
List<Integer> tempArr = new ArrayList<>();
// deque.size()作为循环初始值--即为每层节点个数,且后徐追加影响size但循环次数不变
for (int i = deque.size(); i > 0; i--) {
// 弹出队列节点放入层集合tempArr中
TreeNode node = deque.poll();
tempArr.add(node.val);
// 判断是否节点有下一层左右节点
if (node.left != null) {
deque.offer(node.left);
}
if (node.right != null) {
deque.offer(node.right);
}
}
// 层节点集合放入多层节点集合中
array.add(tempArr);
}
return array;
}
复杂度分析:
时间复杂度 O(N): N为二叉树的节点数量,即 BFS 需循环 N次。
空间复杂度 O(N): 最差情况下,即当树为平衡二叉树时,最多有N/2 个树节点同时在 queue 中,使用O(N) 大小的额外空间。
作者:jyd
链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/solution/mian-shi-ti-32-ii-cong-shang-dao-xia-da-yin-er-c-5/