2022-03-30 19:05阅读: 33评论: 0推荐: 0

力扣-102-二叉树的层次遍历

102-二叉树的层次遍历

使用队列实现
思路:

  1. 将根节点的指针插入到队中
  2. 当队列不为空则(循环)
    队首元素出栈,并访问其指向的节点
    若当前节点的左/右孩子不为空,则将其指针依次入队

代码如下:

class Solution
{
public:
vector<vector<int>> levelOrder(TreeNode *root)
{
// 声明一个用于保存结果的二维数组
vector<vector<int>> ret;
if (!root)
{
return ret;
}
// 定义一个队列
queue<TreeNode *> q;
q.push(root);
// 1. 将根节点指针插入队列
// 怎么记录它的层次?
while (!q.empty())
{
int currentLevelSize = q.size(); // 当前队列的长度
// 其实就是上一个循环中向队列中插入元素的数量
// 并且每一次循环都会清空当前队列中的元素
// 代表了当前层的元素数量
// 为什么能代表?感觉首先是上面的两个特性,在每一次循环开始前读取,并且在每一次循环结束前清空读取到数量的元素,那么就保证了每一次读到的都是上一次循环新插入的元素数量
// 又初始化为根节点的第一层1个
// 每次都会把父节点全部弹出,新获取到的是父节点的子节点数量,即:下一层的元素个数
ret.push_back(vector<int>()); // 向二位數組中插入一個空的
// 这里是怎么保证二叉树每一层的?
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;
}
};

与《剑指Offer》-32:“从上到下打印二叉树”如出一辙,都是二叉树的层次遍历,但是剑指Offer这题要求打印的是一个一维数组,降低了难度,与之相对的则是它用到了deque,双向队列,多了一个头插方法

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/16078590.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(33)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起