力扣-102-二叉树的层次遍历
102-二叉树的层次遍历
使用队列实现
思路:
- 将根节点的指针插入到队中
- 当队列不为空则(循环)
队首元素出栈,并访问其指向的节点
若当前节点的左/右孩子不为空,则将其指针依次入队
代码如下:
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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步