题目
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 <= Node.val <= 1000
思路和解题方法
首先定义了一个函数
levelOrder
,接受一个指向根节点的指针root
,返回一个二维向量ans
。在函数内部,首先创建一个队列
que
,用于存储待处理的节点。如果根节点root
不为空,将其加入队列。接下来,创建一个空的二维向量
ans
,用于存储遍历结果。使用一个循环,当队列不为空时,执行以下操作:
- 获取当前队列的大小
size
,表示当前层的节点个数。- 创建一个空的一维向量
vec
,用于存储当前层的节点值。- 在一个嵌套循环中,从队列中取出
size
个节点:
- 取出队头节点
node
,并将其值加入到vec
中。- 如果该节点有左子节点,将左子节点加入队列。
- 如果该节点有右子节点,将右子节点加入队列。
- 将
vec
加入到ans
中,表示当前层的节点值已经遍历完成。- 重复上述操作,直到队列为空。
- 返回最终的结果
ans
,即二叉树的层次遍历结果。
复杂度
时间复杂度:
O(n)
其中n是二叉树中节点的数量。
空间复杂度n
O(n)
队列中元素的个数不超过 nnn 个,故渐进空间复杂度为 O(n)
c++ 代码
/**
* 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) {
// 创建一个队列,用于存储待处理的节点
queue<TreeNode*> que;
// 如果根节点不为空,将其加入队列
if(root!=NULL) que.push(root);
// 创建一个二维向量ans,用于存储遍历结果
vector<vector<int>> ans;
// 当队列不为空时,执行以下操作:
while(!que.empty())
{
// 获取当前队列的大小size,表示当前层的节点个数
int size = que.size();
// 创建一个空的一维向量vec,用于存储当前层的节点值
vector<int> vec;
// 从队列中取出size个节点
for(int i=0;i<size;i++)
{
// 取出队头节点node,并将其值加入到vec中
TreeNode *node = que.front();
que.pop();
vec.push_back(node->val);
// 如果该节点有左子节点,将左子节点加入队列
if(node->left) que.push(node->left);
// 如果该节点有右子节点,将右子节点加入队列
if(node->right) que.push(node->right);
}
// 将vec加入到ans中,表示当前层的节点值已经遍历完成
ans.push_back(vec);
}
// 返回最终的结果ans,即二叉树的层次遍历结果
return ans;
}
};
觉得有用的话可以点点赞,支持一下。
如果愿意的话关注一下。会对你有更多的帮助。
每天都会不定时更新哦 >人< 。