力扣-102-二叉树的层次遍历
102-二叉树的层次遍历
使用队列实现
思路:
- 将根节点的指针插入到队中
- 当队列不为空则(循环)
队首元素出栈,并访问其指向的节点
若当前节点的左/右孩子不为空,则将其指针依次入队
代码如下:
class Solution
{
public:
vector> levelOrder(TreeNode *root)
{
// 声明一个用于保存结果的二维数组
vector> ret;
if (!root)
{
return ret;
}
// 定义一个队列
queue q;
q.push(root);
// 1. 将根节点指针插入队列
// 怎么记录它的层次?
while (!q.empty())
{
int currentLevelSize = q.size(); // 当前队列的长度
ret.push_back(vector()); // 向二位數組中插入一個空的
// 这里是怎么保证二叉树每一层的?
for (int = 1; i <= currentLevelSize; ++i)
{
auto node = q.front();
q.pop();
ret.back().push_back(node->val);
// 因爲ret是一个二维数组,所以back返回的是一个一维数组
if (!node->left.empty())
{
q.push(node->left);
}
if (!node->right.empty())
{
q.push(node->right);
}
}
}
return ret;
}
};
没搞懂的点有两个:
- 虽然知道了思路,但是不知道为什么要这么做、为什么这样做是正确的
- currentLevelSize变量是怎么配合for循环实现将二叉树的每一层正确地输出到二维数组中的