提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
今天是跟着代码随想录刷题的第15天,今天主要学了以下内容:层序遍历和各种变种。
提示:以下是本篇文章正文内容,下面案例可供参考
一、层序遍历
二叉树的层序遍历
思路:就是把根节点加进去,然后把这个节点的左右节点加进去一个队列,队列里有多少个节点就在循环中弹几个节点出来,同时把每个左右节点的左右节点再放进去,以此类推,这些左右节点的个数决定了弹几次,然后同时再把这些左右节点的左右节点再加进去。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
queue<TreeNode*> que;
if(root!=NULL) que.push(root);
while(!que.empty())
{
int size=que.size();
vector<int> faker;
while(size--)
{
TreeNode* a=que.front();
if(a->left) que.push(a->left);
if(a->right) que.push(a->right);
faker.push_back(a->val);
que.pop();
}
result.push_back(faker);
}
return result;
}
};
二、二叉树的右视图
思路:这个就是每一层只输出最后一个就可以了数字就可以了,通过size找到最后一个的位置、
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
vector<int> result;
queue<TreeNode*> que;
if(root!=NULL) que.push(root);
while(!que.empty())
{ int size=que.size();
while(size--)
{
TreeNode* a=que.front();
if(size==0)
{
que.pop();
result.push_back(a->val);
}
else que.pop();
if(a->left) {que.push(a->left);}
if(a->right) {que.push(a->right);}
}
}
return result;
}
};
三、二叉树的层平均值
思路:每一层求和除以size取一个平均值就可以了
class Solution {
public:
vector<double> averageOfLevels(TreeNode* root) {
vector<double> result;
double total=0;
queue<TreeNode*> que;
if(root!=NULL) que.push(root);
while(!que.empty())
{
int size=que.size();
int size1=size;
while(size--)
{
TreeNode* a=que.front();
que.pop();
total=total+(a->val);
if(a->left) que.push(a->left);
if(a->right) que.push(a->right);
}
total=total/size1;
result.push_back(total);
total=0;
}
return result;
}
};
四、N叉树的层序遍历
思路:利用root->children[i]来遍历N叉树。
class Solution {
public:
vector<vector<int>> levelOrder(Node* root) {
vector<vector<int>> result;
queue<Node*> que;
if(root!=NULL) que.push(root);
while(!que.empty())
{
int size=que.size();
vector<int> vec;
while(size--)
{
Node* a=que.front();
vec.push_back(a->val);
que.pop();
for(int i=0;i<a->children.size();i++)
{
if(a->children[i]) que.push(a->children[i]);
}
}
result.push_back(vec);
}
return result;
}
};