题目:
给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。
例如,给定一个 3叉树 :
返回其层序遍历:
[
[1],
[3,2,4],
[5,6]
]
说明:
树的深度不会超过 1000。
树的节点总数不会超过 5000。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-ary-tree-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法:
普通的N叉树层序遍历比较好写,如果需要在此基础上逐层输出,实现时需要在最终结果之前加一层 tmp vector,用于保存每个layer的结点
时间复杂度: O(n) //虽然是while、for、for三层嵌套,但是Tree中每个结点只会访问一次,所以时间复杂度还是O(n)
空间复杂度: O(n) //queue
关键点:
相比于普通的层序遍历的代码:
while(!q.empty()) {
result.push_back(cur->val);
for(auto iter : cur->children) {
q.push(iter);
}
}
按层输出加入一个额外的for循环:
while(!q.empty()) {
int size = q.size(); //size必须先保存,不能直接作为for判断条件,因为for循环体中会改变q
for(int i = 0; i < size; ++i) { //按层循环
cur = q.front();
q.pop();
result.push_back(cur->val);
for(auto iter : cur->children) {
q.push(iter);
}
}
}
代码实例:
/*
// 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) {
vector<vector<int>> result;
if(root == nullptr) return result;
queue<Node*> q;
q.push(root);
while(!q.empty()) {
vector<int> layer;
int size = q.size(); //必须先保存q.size()
for(int i = 0; i < size; ++i) { //按层循环
Node* cur = q.front();
q.pop();
layer.push_back(cur->val);
for(auto iter : cur->children) {
q.push(iter);
}
}
result.push_back(layer);
}
return result;
}
};