BFS--------N叉树的层序遍历
429. N 叉树的层序遍历 - 力扣(LeetCode)
1.题目解析
给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。
2.示例
示例 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]]
3.解题思路
1.这道题就是对N叉树进行层序遍历(BFS),只需要逐层对树进行遍历即可
2.创建返回值ret,ret是一个二维数组,因此使用vector<vector<int>> ret
3.使用队列的FIFO性质,创建一个队列queue<Node*> q
4.队列 q
被用作实现 BFS 的数据结构,按照从上到下的顺序访问树的所有节点。
5.q.push(root)将根节点加入到队列q中
6.当q.size()不为空时,一直执行while循环
7.int sz = q.size()
获取当前队列中的节点数,即当前层的节点数
8.vector<int> tmp;
:用于存储当前层节点的值
-
循环
for(int i = 0; i < sz; i++)
:遍历当前层的所有节点。-
Node* t = q.front();
:获取队列头部的节点。 -
q.pop();
:从队列中移除该节点。 -
tmp.push_back(t->val);
:将节点的值添加到tmp
列表中。 -
for(Node* child : t->children)
:遍历该节点的所有子节点。-
if(child != nullptr) q.push(child);
:如果子节点不为空,将其加入队列,以便后续访问。
-
-
4.代码实现
/*
// 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>> ret;
queue<Node*> q;
if(root == nullptr)
return ret;
q.push(root);
while(q.size())
{
int sz = q.size();//先求出本层元素的个数
vector<int> tmp;
for(int i = 0; i < sz; i++)
{
Node* t = q.front();
q.pop();
tmp.push_back(t->val);
for(Node* child : t->children)
{
if(child != nullptr)
q.push(child);
}
}
ret.push_back(tmp);
}
return ret;
}
};