1.题目解析
本题是关于二叉树的层序遍历,不过这里的难点是如何将每一层的数据存储在数组并将整体存储在一个二维数组中,具体的算法原理我们在下面给出
2.算法原理
关于将每层数据分别存储在不同数组中,我们可以定义一个levelSize变量来存储栈内数据个数,然后限制对vector容器中的插入次数,来达到每个vector容器都只保留每一层的数据即可,并且关于每一层数据的逐层入栈,我们可以在每一个根节点出栈时将该节点的左右子结点入栈,用来达到逐层入栈的效果,并且此时栈内数据就是每一层的数据个数,我们可以用这个数据的个数来限制插入次数
3.代码展示
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root)
{
//创建一个二维数组来存储每一层的信息
vector<vector<int>> vv;
//创建一个队列用来取出每一层数据
queue<TreeNode*> q;
int levelSize = 0;//控制层数
//对根节点特殊处理
if(root)
{
q.push(root);
levelSize = 1;
}
while(!q.empty())
{
vector<int> v;
while(levelSize--)
{
//进入该层树节点
TreeNode* front = q.front();
q.pop();
v.push_back(front->val);
//进入下一层树节点
if(front->left)
{
q.push(front->left);
}
if(front->right)
{
q.push(front->right);
}
}
//二维数组中存储每一层的数据
vv.push_back(v);
//此时栈内数据个数就是本层所有数据,直接取出即可
//需要使用levelSize来保证完全取出
levelSize = q.size();
}
return vv;
}
};