携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情 >>
一、题目描述 LeetCode剑指 Offer 32 - II.
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:给定二叉树:[3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
按层序遍历返回其结果:
[
[3],
[9,20],
[15,7]
]
二、解题思路
1.本题要求按层序遍历二叉树,考虑广度优先搜索解决。
2.在搜索时可以考虑使用队列来用作存储结构,将二叉树的每一层依次入队、出队以实现层序遍历效果。具体细节如下:
- 首先将根节点入队,并计算队列长度;
- 进入 for 循环,循环的终止条件为达到队列长度,依次将节点出队,并将节点值加入到数组中进行保存,出队的同时判断其左右节点是否为空,若不为空则将其入队;
- 在退出 for 循环时,将数组保存到解集中,重置数组和队列长度。
三、代码
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (root == null){
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
TreeNode node = null;
while (!queue.isEmpty()){
List<Integer> list = new ArrayList<>();
int count = queue.size();
for (int i=count; i>0; i--){
node = queue.poll();
list.add(node.val);
if (node.left != null){
queue.add(node.left);
}
if (node.right != null){
queue.add(node.right);
}
}
res.add(list);
}
return res;
}
四、总结
本题使用队列进行二叉树的层序遍历,灵活的使用了队列的特点,并巧妙的将队列长度作为循环的终止条件,仅使用了一个队列就完成了遍历过程。每个节点进队出队各一次,故渐进时间复杂度为 O(n)O(n);队列中元素的个数不超过 nn 个,故渐进空间复杂度为 O(n)O(n)。