阅前须知
这篇博客是关于二叉树的层序遍历详解,但是不涉及二叉树的基本定义及原理。
通过队列实现二叉树的层序遍历的各类题型,总结出来二叉树层序遍历的模板C++代码。
个人认为非常有价值
可以直接点击每一道题的题目,直达Leetcode。
参考代码随想客
Leetcode 102.二叉树的层序遍历
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root)
{
queue<TreeNode*> que;
vector<vector<int>> res;
if(root!=nullptr)
{
que.push(root);
}
while(!que.empty())
{
int size=que.size();
vector<int> temp; //每次都是新数组
for(int i=0;i<size;i++)
{
TreeNode* node=que.front(); //因为每一次都会pop()掉,所以一直保持横向移动
que.pop(); //pop()掉是为了同一层横向移动
temp.push_back(node->val);
if(node->left)
{
que.push(node->left);
}
if(node->right)
{
que.push(node->right);
}
}
res.push_back(temp);
}
return res;
}
};
Leetcode 107.二叉树的层序遍历Ⅱ
这道题和102相比,就多了最后一个reverse();
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root)
{
queue<TreeNode*> que;
vector<vector<int>> res;
if(root!=nullptr)
{
que.push(root);
}
while(!que.empty())
{
vector<int> temp;
int size=que.size();
for(int i=0;i<size;i++)
{
TreeNode* node=que.front();
que.pop();
temp.push_back(node->val);
if(node->left)
{
que.push(node->left);
}
if(node->right)
{
que.push(node->right);
}
}
res.push_back(temp);
}
reverse(res.begin(),res.end());
return res;
}
};
Leetcode 199.二叉树的右视图
class Solution {
public:
vector<int> rightSideView(TreeNode* root)
{
//按照层序遍历,每一层判断是否为该层最后一个元素。
vector<int> res;
queue<TreeNode*> que;
if(root!=nullptr)
{
que.push(root);
}
while(!que.empty())
{
int size=que.size();
for(int i=0;i<size;i++)
{
TreeNode* node=que.front();
que.pop();
if(node->left)
{
que.push(node->left);
}
if(node->right)
{
que.push(node->right);
}
if(i==(size-1))
{
res.push_back(node->val);
}
}
}
return res;
}
};
Leetcode 637.二叉树的层平均值
class Solution {
public:
vector<double> averageOfLevels(TreeNode* root)
{
vector<double> res;
queue<TreeNode*> que;
if(root!=nullptr)
{
que.push(root);
}
while(!que.empty())
{
int size=que.size();
double sum=0.0;
for(int i=0;i<size;i++)
{
TreeNode* node=que.front();
que.pop();
sum+=node->val;
if(node->left)
{
que.push(node->left);
}
if(node->right)
{
que.push(node->right);
}
}
res.push_back(sum/size);
}
return res;
}
};
Leetcode 429.N叉树的层序遍历
class Solution {
public:
vector<vector<int>> levelOrder(Node* root)
{
vector<vector<int>> res;
queue<Node*> que;
if(root!=nullptr)
{
que.push(root);
}
while(!que.empty())
{
int size=que.size();
vector<int> temp;
for(int i=0;i<size;i++)
{
Node* node=que.front();
que.pop();
temp.push_back(node->val);
for(int i=0;i<node->children.size();i++)
{
if(node->children[i])
{
que.push(node->children[i]);
}
}
}
res.push_back(temp);
}
return res;
}
};
Leetcode 515.在每个树行中找最大值
class Solution {
public:
vector<int> largestValues(TreeNode* root)
{
vector<int> res;
queue<TreeNode*> que;
if(root!=nullptr)
{
que.push(root);
}
while(!que.empty())
{
int size=que.size();
int Max_Num=INT_MIN;
for(int i=0;i<size;i++)
{
TreeNode* node=que.front();
que.pop();
Max_Num=max(Max_Num,node->val);
if(node->left)
{
que.push(node->left);
}
if(node->right)
{
que.push(node->right);
}
}
res.push_back(Max_Num);
}
return res;
}
};
Leetcode 116.填充每个节点的下一个右侧节点指针
class Solution {
public:
Node* connect(Node* root)
{
queue<Node*> que;
if(root!=nullptr)
{
que.push(root);
}
while(!que.empty())
{
Node* nodepre;
Node* node;
int size=que.size();
for(int i=0;i<size;i++)
{
if(i==0)
{
nodepre=que.front();
que.pop();
node=nodepre;
}
else
{
node=que.front();
que.pop();
nodepre->next=node;
nodepre=nodepre->next; //指针传递
}
if(node->left)
{
que.push(node->left);
}
if(node->right)
{
que.push(node->right);
}
}
}
return root;
}
};
Leetcode 117.填充每个节点的下一个右侧节点指针Ⅱ
和116这一题有所区别:
这一题没有说是满二叉树
但是代码实现和116一模一样 原汁原味
class Solution {
public:
Node* connect(Node* root)
{
queue<Node*> que;
if(root!=nullptr)
{
que.push(root);
}
while(!que.empty())
{
int size=que.size();
Node* nodepre;
Node* node;
for(int i=0;i<size;i++)
{
if(i==0)
{
nodepre=que.front();
que.pop();
node=nodepre;
}
else
{
node=que.front();
que.pop();
nodepre->next=node;
nodepre=nodepre->next;
}
if(node->left)
{
que.push(node->left);
}
if(node->right)
{
que.push(node->right);
}
}
}
return root;
}
};
Leetcode 104.二叉树的最大深度
这道题要算二叉树的最大深度,所以一样也采用层次遍历的模板,可以完美解决。
class Solution {
public:
int maxDepth(TreeNode* root)
{
queue<TreeNode*> que;
int depth=0;
if(root!=nullptr)
{
que.push(root);
}
while(!que.empty())
{
depth++;
int size=que.size();
TreeNode* node;
for(int i=0;i<size;i++)
{
node=que.front();
que.pop();
if(node->left)
{
que.push(node->left);
}
if(node->right)
{
que.push(node->right);
}
}
}
return depth;
}
};
Leetcode 111.二叉树的最小深度
这道题要求二叉树的最小深度,那么什么时候说明截止了呢。只有当一个节点的左右孩子都为空时,说明这个节点时叶子节点。
所以本题依然是模板题,采用层次遍历的方法,加以修改就可以了。
class Solution {
public:
int minDepth(TreeNode* root)
{
queue<TreeNode*> que;
int depth=0;
if(root!=nullptr)
{
que.push(root);
}
while(!que.empty())
{
int size=que.size();
depth++;
TreeNode* node;
for(int i=0;i<size;i++)
{
node=que.front();
que.pop();
if(node->left)
{
que.push(node->left);
}
if(node->right)
{
que.push(node->right);
}
if(!node->left&&!node->right)
{
return depth;
}
}
}
return depth;
}
};