1.题目解析
题目来源(I):102.二叉树的层序遍历
测试用例(I)
题目来源(II): 107.二叉树的层序遍历 II
测试用例(II):
2.算法原理
这里的层序遍历主要的目的是取出二叉树每一层的数据,并且将其存入一个二维数组中,主要难点是如何准确的将每一层数据取出,解决的方法是创建临时变量levelsize,具体操作如下:
1.创建一个二维数组与队列,队列用来取出每一层数据,二维数组用来存储每一层数据,创建临时变量levelsize来记录每一层数据个数(取出一层后,此时队列中所有元素个数)
2.首先对根节点特殊处理,然后处理其他子节点,取出每一个节点都要判断是否需要将其左右子结点入队列,不为空则入队列,然后将这一层数据先存入一个一维数组中
3.更新levelsize,此时队列中所以元素就是下一层数据,则队列此时的长度就是levelsize,然后将一维数组的数据存入二维数组,然后更新下一层数据,直到队列为空则结束
4.第二道题只用将第一道题的结果翻转顺序即可
3.实战演练
102.二叉树的层序遍历
/**
* 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;
}
};
107.二叉树的层序遍历 II
/**
* 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>> levelOrderBottom(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);
}
}
//此时出完一层更新下一层数据个数
levelsize = q.size();
//将该层数据存入二维数组中
vv.push_back(v);
}
//要求自底向上,需要翻转
reverse(vv.begin(),vv.end());
return vv;
}
};