1.题目描述
剑指 Offer 32 - II. 从上到下打印二叉树 II
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
2.解题思路与代码
2.1 解题思路
题目要求一层一层打印节点,并且一层的节点放在一个数组里面,那么就需要使用到二叉树的层序遍历。在层序遍历的同时需要确定每一层是否遍历完成,遍历完一层之后需要将这一层的节点列表放入结果列表中。这里就需要使用到二叉树层序遍历的一个特性:节点个数等于队列长度时,表示上一层已遍历完成。于是使用 layerCount 来记录节点放入队列次数,每放一次 layerCount 加一,当 layerCount 与队列长度相同时,此时上一层遍历完成,需要将上一层节点列表放入结果中,并且 layerCount 重新设置为 0 表示开始下一层的节点统计。
2.2 代码
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans = new ArrayList<>();
if (root == null) {
return ans;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int layerCount = 1;
List<Integer> tmp = new ArrayList<>();
tmp.add(root.val);
while (!queue.isEmpty()) {
if (layerCount == queue.size()) {
ans.add(tmp);
tmp = new ArrayList<>();
layerCount = 0;
}
TreeNode poll = queue.poll();
if (poll.left != null) {
layerCount++;
queue.add(poll.left);
tmp.add(poll.left.val);
}
if (poll.right != null) {
layerCount++;
queue.add(poll.right);
tmp.add(poll.right.val);
}
}
return ans;
}
}
2.3 测试结果
通过测试
3.总结
- 使用 layerCount 统计放入队列次数,当 layerCount 等于队列长度时,上一层遍历完成
- 遍历完一层之后将这一层节点列表放入结果列表中,并且 layerCount 重置为 0