📝 题目描述

题目链接二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。(即逐层地,从左到右访问所有节点)。

示例:

示例 1:

1
2
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

1
2
输入:root = [1]
输出:[[1]]

示例 3:

1
2
输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

💡 解题思路

方法一:广度优先搜索

这个题比较简单,我们只需要构造一个队列即可。

首先放入根节点(非空),然后只要队列不为空,我们就持续遍历。

  • 首先获取队列中当前节点的数量,也就是本层的节点数量;
  • 然后进入二层循环,遍历当前节点,存储节点值,并将每个本层节点的非空子节点入队。

当队列为空时,循环结束。

🔧 代码实现

1、广度优先搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
if (!root) return ans;
queue<TreeNode*> qu;
qu.push(root);
while(!qu.empty()) {
// 获取本层节点数量,锁面板
int size = qu.size();
vector<int> vec;
for (int i = 0; i < size; i++) {
TreeNode* temp = qu.front(); qu.pop();
vec.push_back(temp -> val);
if (temp -> left) qu.push(temp -> left);
if (temp -> right) qu.push(temp -> right);
}
ans.push_back(vec);
}
return ans;
}
};

📊 复杂度分析

1、广度优先搜索

  • 时间复杂度O(n)O(n),每个点进队出队各一次。
  • 空间复杂度O(n)O(n),队列中元素的个数不会超过 nn 个。

🎯 总结

  • 核心思想:记住层序遍历的思路,便于其他题目做变体。