版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题解:
题解:
class Solution {
public:
//解法1:迭代法
vector<vector<int>> levelOrder_1(Node* root)
{
if(root==nullptr)return {};
vector<vector<int>> result;
queue<Node*> record;
record.push(root);
while(!record.empty())
{
vector<int> temp;
int size=record.size();//每一层的节点数
for(int i=0;i<size;++i)//size规定了当前层的节点数,我们将当前层的所有节点值添加到temp中,顺便将下一层的所有孩子节点添加到队列中
{
Node* node=record.front();record.pop();//获得队头元素
temp.push_back(node->val);
for(auto child:node->children)
record.push(child);
}
result.push_back(temp);
}
return result;
}
//解法2:迭代法,另一种写法
vector<vector<int>> levelOrder_2(Node* root)
{
if(!root)return {};
vector<vector<int>> result;
queue<pair<Node*,int>> record;
record.push(make_pair(root,0));//根节点入队列
while(!record.empty())
{
Node* node=record.front().first;//节点
int height=record.front().second;//节点所在的层数,即对应数组中的下标
record.pop();//队头出栈
if(height==result.size())result.push_back({node->val});//下标与数组大小相等,在数组尾添加元素
else result[height].push_back(node->val);//下标比数组大小下,在下标所对应的数组添加元素
for(auto child:node->children)//遍历子树,
record.push(make_pair(child,height+1));
}
return result;
}
//解法3:递归版,需要传入下标值,否则回溯的话,index就不能回溯到上一层的下标
vector<vector<int>> levelOrder_3(Node* root)
{
vector<vector<int>> result;
helper(root,0,result);
return result;
}
void helper(Node* root,int index,vector<vector<int>>& result)
{
if(!root) return ;
if(result.size()==index)result.push_back({root->val});
else result[index].push_back(root->val);
for(auto child:root->children)
helper(child,index+1,result);
}
};