这道题与传统的层序遍历相比只是一个节点允许有多个子节点。只需要将传统层序遍历中判断当前节点的左右子节点并加入队列的操作改为利用循环加入多个子节点就可以了。
时间复杂度:O(n),空间复杂度:O(n)
思路:
- 创建一个队列,如果不为空树,则将根节点(第一个节点)入队。
- 构建一个循环,循环终止条件为队列中没有需要处理的节点,即将树中全部节点处理完。
- 再构建一个嵌套循环,用于处理当前层级的所有节点,循环终止条件是处理完当前级别的所有节点。
- 在此循环中,将队列的最前面的节点出队,将该节点的值加入sum求总和,然后将节点从队列中删除。
- 利用循环将出队节点的子节点都放入队列中。
- 当嵌套循环结束后,将vector<int>中保存的当前层级的所有节点放入vector<vector<int>>二维数组中保存。
- 大循环结束,返回结果vector<int>。
代码:
/*
// 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) {
queue<Node*> que;
if (root != NULL) que.push(root);
vector<vector<int>> result;
while (!que.empty()) {
int size = que.size();
vector<int> layer;
while (size--) {
Node* node = que.front();
que.pop();
layer.push_back(node->val);
for (int i = 0; i < node->children.size(); i++) { // 将节点孩子加入队列
if (node->children[i])
que.push(node->children[i]);
}
}
result.push_back(layer);
}
return result;
}
};