题目描述
给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)
示例 1:
输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]
示例 2:
输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]
示例1:
示例2:
思路
层次遍历,不同之处在于如何将当前节点的所有子节点加入队列,以往的二叉树只需判断左右子树是否为空,N叉树同理,判断所有子节点是否为空即可。
for(Node* child : node->children)
if(child)
que.push(child);
- for (Node* child : node->children):这是一个范围基于的for循环(也称为基于范围的for语句),用于遍历当前节点 node 的子节点列表 children。children是一个 vector<Node*> 类型的容器,存储了当前节点的所有子节点的指针。
- 在每次循环迭代中,child 变量将被设置为 children 容器中的下一个元素,代表一个子节点的指针。
- if (child): 这个检查确保子节点指针 child 不是 nullptr。这是一个安全检查,防止将空指针加入到队列中
完整代码
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
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> vec; // 存储当前层的值
for(int i = 0; i < size; i++){
Node* node = que.front(); // 获取当前队列的第一个节点
que.pop(); // 从队列中移除该节点
vec.push_back(node->val); // 将节点的值加入到当前层的结果中
// 遍历当前节点的所有子节点,并将它们加入队列
for(Node* child : node->children)
if(child)
que.push(child);
}
result.push_back(vec); // 将当前层的结果加入到最终结果中
}
return result;
}
};
int main()
{
Node* root = new Node(1); // N叉树每个节点可以拥有任意数量的子节点
Node* child1 = new Node(3);
Node* child2 = new Node(2);
Node* child3 = new Node(4);
Node* child4 = new Node(5);
Node* child5 = new Node(6);
child3->children = {child4, child5};
root->children = {child1, child2, child3};
Solution s;
vector<vector<int>> result = s.levelOrder(root);
for(const auto& level : result){
cout << "[";
for(size_t i = 0; i < level.size(); i++){
cout << level[i];
if(i != level.size() - 1) cout << ",";
}
cout << "]";
}
cout << "]" << endl;
return 0;
}