二叉树的层序遍历
一:题目
解释:
①:返回的是一个vector<vector<int>>类型的值,再结合实例可知,返回的是一个vector类型的对象,其每个元素都是一个vector<int>这样的整形数组,每个数组存储的是该层的值
②:示例3中根节点为空 则直接返回vector<vector<int>>类型的对象即可
二:思路
①:核心思路
使用队列:
队列用于按层存储节点,确保按层遍历。
每次处理完一层后,队列中剩下的节点就是下一层的节点。
分层处理:
通过记录当前层的节点数,确保每次只处理当前层的节点。
②:.实现步骤
初始化:
如果根节点不为空,将其入队,并设置当前层的节点数Leve1Size = 1。
外层循环(按层遍历)∶
当队列不为空时,继续遍历。
创建一个数组v,用于存储当前层的节点值。
内层循环(处理当前层):
遍历当前层的所有节点(由Leve1size控制次数)︰
取出队头节点cur。
将cur的值存入v。
将cur的左右子节点(如果存在)入队。将cur出队。
更新层信息:
处理完当前层后,更新(LevelSize为队列的当前大小(即下一层的节点数)。
将当前层的节点值数组√存入结果vv。
返回结果:
最终返回存储所有层节点值的二维数组vv。
三:代码
/**
* 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 != nullptr) { // 如果根节点不为空
q.push(root); // 将根节点入队
LevelSize = 1; // 当前层节点数为 1
}
while (!q.empty()) // 当队列不为空时,继续遍历
{
vector<int> v; // 存储当前层的节点值
while (LevelSize--) // 遍历当前层的所有节点
{
TreeNode* cur = q.front(); // 取出队头节点
if (cur->left != nullptr) // 如果左子节点不为空
{
q.push(cur->left); // 将左子节点入队
}
if (cur->right != nullptr) // 如果右子节点不为空
{
q.push(cur->right); // 将右子节点入队
}
v.push_back(cur->val); // 将当前节点的值存入当前层的数组
q.pop(); // 当前节点处理完毕,出队
}
LevelSize = q.size(); // 更新下一层的节点数
vv.push_back(v); // 将当前层的节点值数组存入结果
}
return vv; // 返回最终结果
}
};
四:易错点
错误1:忘记刷新v
解释:
vector<int> v;这句代码不能放在while的外面,我们放在两个while夹层中是因为,每次v存储完一层节点的值,将v放进vv后,则会创建一个新的v;所以这里的错误在于v没有被重新建立,此时需要在将v放进vv后,进行 v.clear();操作即可
错误1修正:
错误2:所有节点放进一个数组
解释:
不能单纯的以为用LevelSize是否>0来判断循环,因为你出一个LevelSize--,进一个LevelSize++,最后只会把所有节点的值存储进一个数组中,而不是每一层单独在一个数组中,由错误的输出结果也可知,vv中仅仅存放了一个数组
错误2,是思路的错误,无法修改