难度:中等
目录
一、问题描述
这里直接采用LeetCode上面的问题描述。
给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。
下面给出示例:
提示:
- 树的高度不会超过
1000
- 树的节点总数在
[0, 10^4]
之间
二、解题思路
1、思路
由于是层次遍历,因此首先想到的是使用 BFS(广度优先搜索) 来实现对每一层的一个节点进行记录,并且保存进容器中。这里 需要设置一个容器保存每一层的节点 记为 nums ,需要一个保存每一层节点的容器 记为 ans ,也就是需要返回的容器。
由于需要保存所有层的节点,所以我们需要统计目前层数的节点数目,这里使用 layers 统计目前层数一共有多少个节点,若当前层的节点都已经保存在 nums 中,然后将 nums 存储在 ans 中并且,清空 nums 继续保存下一层的节点。
layers 初始值为 q.size() 也就是当前层数,每次遍历层次节点后 layers 都要进行减减操作 ,这样当 nums 为 0 的时候即可将 nums 的所有结点 也就是当前层的所有结点保存在 ans 中,并且更新 layers 也就是下一层有多少结点 为 q.size() 。
执行完 BFS 后,ans中保存所有层的结点。
三、解题
1、代码实现
/*
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> children;
Node() {}
Node(int _val) {
val = _val;
}
Node(int _val, vector<Node*> _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
public:
vector<vector<int>> levelOrder(Node* root) {
if(!root){
return {};
}
//保存答案
vector<vector<int>> ans;
ans.push_back({root->val});
queue<Node*> q;
q.emplace(root);
//存储每一层的全部结点
vector<int> nums;
// 保存当前层的结点个数
int layers = q.size();
while(!q.empty()){
Node* temp = q.front();
q.pop();
//遍历该结点的所有子节点 并入队,且将结点保存进 nums 中
for(int i = 0; i < temp->children.size(); i++){
q.emplace(temp->children[i]);
nums.push_back(temp->children[i]->val);
}
layers--;
// 当前层结点为 0 后 将该层的所有结点保存进 答案中 并更新下一层的节点数目
if(layers == 0){
layers = q.size();
ans.push_back(nums);
nums.clear();
}
}
//这里需要去掉最后保存的一个 空数组
ans.pop_back();
return ans;
}
};
2、时间复杂度 and 空间复杂度
时间复杂度:
空间复杂度: