二叉树的层序遍历
102二叉树的层序遍历
题目链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
之前的二叉树的层序遍历利用队列进1个出1个,但是这里是把每一层放在一起。思路还是利用队列来解决。
分析如下图:
代码如下:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root)
{
vector<vector<int>> vv;
//定义1个队列存结点
queue<TreeNode*> q;
//树为空的情况
if(root == nullptr)
return vv;
//第1层的结点个数为1个
int leveSize = 1;
//将root入队
q.push(root);
while(!q.empty())
{
//用vector来存结点的值
vector<int> v;
//根据leveSize来控制每层出的个数
for(int i = 0; i < leveSize; ++i)
{
TreeNode* front = q.front();
v.push_back(front->val);
q.pop();
//pop掉后,将front的左右入队
if(front->left)
{
q.push(front->left);
}
if(front->right)
{
q.push(front->right);
}
}
//levelSize剩下的就是下一层的数据个数
leveSize = q.size();
vv.push_back(v);
}
return vv;
}
};
就过了,时间复杂度为O(N).
107二叉树的层序遍历2
题目链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/
他这里要求我们从下往上输出,那我们直接将上面的代码考过来,在return 之前将vector逆置一下
即可。
代码如下:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root)
{
vector<vector<int>> vv;
//定义1个队列存结点
queue<TreeNode*> q;
//树为空的情况
if(root == nullptr)
return vv;
//第1层的结点个数为1个
int leveSize = 1;
//将root入队
q.push(root);
while(!q.empty())
{
//用vector来存结点的值
vector<int> v;
//根据leveSize来控制每层出的个数
for(int i = 0; i < leveSize; ++i)
{
TreeNode* front = q.front();
v.push_back(front->val);
q.pop();
//pop掉后,将front的左右入队
if(front->left)
{
q.push(front->left);
}
if(front->right)
{
q.push(front->right);
}
}
//levelSize剩下的就是下一层的数据个数
leveSize = q.size();
vv.push_back(v);
}
return vv;
}
};
过了,时间复杂度为O(N).