102. 二叉树的层序遍历
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入: root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
示例 2:
输入: root = [1]
输出:[[1]]
示例 3:
输入: root = []
输出:[]
提示:
- 树中节点数目在范围
[0, 2000]
内 - − 1000 ≤ N o d e . v a l ≤ 1000 -1000 \leq Node.val \leq 1000 −1000≤Node.val≤1000
解法一(BFS+队列)
思路分析:
-
对于层序遍历二叉树,可以 采用辅助队列
-
即根据队列先进先出,每次将一层二叉树结点保存到队列中
-
然后根据队列中保存的二叉树结点,获取下一层二叉树的结点
-
然后再继续往下层遍历二叉树
实现代码如下:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans = new ArrayList<>();
if (root == null) // 边界条件
return ans;
Queue<TreeNode> queue = new ArrayDeque<>(); // 辅助队列
queue.offer(root); // 将第一层入队
while (!queue.isEmpty()) {
int size = queue.size(); // 获取该层的节点数
List<Integer> level = new ArrayList<>(); // 保存该层的节点值
for (int i = 0; i < size; ++ i) { // 对每层结点进行遍历 以及获取下一层
TreeNode node = queue.poll();
level.add(node.val);
if (node.left != null)
queue.offer(node.left);
if (node.right != null)
queue.offer(node.right);
}
ans.add(level); // 保存 每层的结点的遍历结果
}
return ans;
}
}
提交结果如下:
解答成功:
执行耗时:1 ms,击败了92.36% 的Java用户
内存消耗:44 MB,击败了5.02% 的Java用户
复杂度分析:
-
时间复杂度: O ( n ) O(n) O(n)
-
空间复杂度: O ( n ) O(n) O(n)
解法二(递归)
思路分析:
-
首先思考递归的参数,因为需要遍历二叉树并保存二叉树的节点值,所以需要传递二叉树的结点和保存结果参数,同时对于二叉树的层序遍历,需要一层一层进行,因此参数中需要包括二叉树的某结点所属层数,保证可以将其添加到对应的层中
-
对于递归的返回值,不需要返回值
-
递归的边界条件;当该结点为空时,则不需要继续往下操作
-
递归的过程;首先需要判断当前结点是否为某一层的第一个结点,是则需要新建列表并保存该节点。然后将该列表保存到结果中,若不是第一个结点,则将其添加的对应的层的列表中
实现代码如下:
class Solution {
// 递归
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans = new ArrayList<>();
BFS(root, 0, ans);
return ans;
}
private void BFS(TreeNode node, int deeply, List<List<Integer>> ans) {
if (node == null) // 已经遍历到最后一层结束
return ;
if (deeply >= ans.size()) { // 出现新层
List<Integer> level = new ArrayList<>();
level.add(node.val);
ans.add(level);
} else { // 该结点在已经建立的层中
ans.get(deeply).add(node.val);
}
BFS(node.left, deeply+1, ans); // 继续向左遍历
BFS(node.right, deeply+1, ans); // 继续向右遍历
}
}
提交结果如下:
解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:43.6 MB,击败了9.20% 的Java用户
复杂度分析:
-
时间复杂度: O ( n ) O(n) O(n)
-
空间复杂度: O ( n ) O(n) O(n)