队列 + 宽搜(BFS)

目录

leetcode题目

一、二叉树的层序遍历

二、二叉树的层序遍历 II

三、N叉树的层序遍历

四、二叉树的锯齿形层序遍历

五、二叉树最大宽度

六、在每个树行中找最大值

七、二叉树的层平均值

八、最大层内元素和

九、二叉树的第K大层和

十、反转二叉树的奇数层


leetcode题目

一、二叉树的层序遍历

102. 二叉树的层序遍历 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-level-order-traversal/

1.题目解析

二叉树的层序遍历

2.算法分析

树的层序遍历是典型要用到队列的场景,因为上一层遍历完之后,遍历下一层是从左到右,也就是要先遍历上一层最左节点的孩子,因此符合先进先出的原则,采用队列!

而题目要求返回二维数组,也就是把每一层遍历的节点放在同一个vector中,可是如何知道每一层的节点个数呢??? 只需要在元素出队列之前用变量记录一下队列当前元素的个数,就是该层节点的数量~

3.算法代码

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> vv;if(root == nullptr) return vv;queue<TreeNode*> q;q.push(root);while(!q.empty()){int levelSize = q.size();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);}return vv;}
};

二、二叉树的层序遍历 II

107. 二叉树的层序遍历 II - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/description/1.题目解析

自底向上层序遍历二叉树

2.算法分析

与题目一解法完全一样,最后将数组逆序一下即可~

3.算法代码

class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root) {vector<vector<int>> vv;if(root == nullptr) return vv;queue<TreeNode*> q;q.push(root);while(!q.empty()){int levelSize = q.size();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);}reverse(vv.begin(), vv.end());return vv;}
};

三、N叉树的层序遍历

429. N 叉树的层序遍历 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/n-ary-tree-level-order-traversal/1.题目解析

N叉树的层序遍历

2.算法分析

与二叉树的层序遍历方法完全一致,区别就是一个节点可能有多个孩子,因此上一层出队列带下一层入队列,需要循环遍历把所有的孩子都带进来~

3.算法代码

class Solution {
public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret; queue<Node*> q;if(root == nullptr) return ret;q.push(root);while(!q.empty()){int sz = q.size(); vector<int>tmp;while(sz--){Node* t = q.front(); q.pop();tmp.push_back(t->val);for(Node* child : t->children) //让下一层节点入队{if(child != nullptr)q.push(child);}}ret.push_back(tmp);}return ret;}
};

四、二叉树的锯齿形层序遍历

103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-zigzag-level-order-traversal/description/1.题目解析

相比之前题目,本题层序遍历是先从左往右,再从右往左,依次类推~

2.算法分析

增加一个标记位,让偶数层的数组逆序即可~

3.算法代码

class Solution {
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root) {vector<vector<int>> ret;if(root == nullptr)return ret;queue<TreeNode*> q;q.push(root);int level = 1;while(!q.empty()){int sz = q.size();vector<int> tmp;while(sz--){TreeNode* front = q.front(); q.pop();tmp.push_back(front->val);if(front->left) q.push(front->left);if(front->right)q.push(front->right);}//判断是否逆序if(level % 2 == 0) reverse(tmp.begin(), tmp.end());ret.push_back(tmp);level++;}    return ret;   }
};

五、二叉树最大宽度

662. 二叉树最大宽度 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/maximum-width-of-binary-tree/description/1.题目解析

每一层的宽度指的是某一层最左非空节点和最右非空节点之间的长度~

2.算法分析

二叉树根节点从1开始编号,创建一个队列,队列中存储的是<节点指针,节点编号>, 如果算上空节点的话那么二叉树就是满的,所以如果某个节点编号是x,那么左孩子节点编号是2*x, 右孩子节点编号是2*x+1, 每一层的长度就是 最右节点编号 - 最左节点编号 + 1, 而我们可以直接用vector来模拟队列~

3.算法代码

class Solution {
public:int widthOfBinaryTree(TreeNode* root) {vector<pair<TreeNode*, unsigned int>> q; //用数组模拟队列q.push_back({root, 1});unsigned int ret = 0; //统计最大宽度while(!q.empty()){//更新这一层的最大宽度auto& [x1, y1] = q[0];auto& [x2, y2] = q.back();ret = max(ret, y2 - y1 + 1);//让下一层入队vector<pair<TreeNode*, unsigned int>> tmp;for(auto& [x, y] : q){if(x->left) tmp.push_back({x->left, y * 2});if(x->right) tmp.push_back({x->right, y * 2 + 1});}q = tmp;}    return ret;    }     
};

六、在每个树行中找最大值

515. 在每个树行中找最大值 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/find-largest-value-in-each-tree-row/1.题目解析

找到二叉树每一行的最大值了,放在一个数组中,返回数组

2.算法分析

依旧是队列+宽搜,遍历每一层的时候用变量记录一下该层的最大值即可~

3.算法代码

class Solution {
public:vector<int> largestValues(TreeNode* root) {vector<int> ret;if(root == nullptr)return ret;queue<TreeNode*> q;q.push(root);while(!q.empty()){int sz = q.size();int tmp = INT_MIN;while(sz--){auto t = q.front();q.pop(); tmp = max(tmp, t->val);if(t->left) q.push(t->left);if(t->right)q.push(t->right);}ret.push_back(tmp);}return ret;}
};

七、二叉树的层平均值

637. 二叉树的层平均值 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/average-of-levels-in-binary-tree/1.题目解析

求二叉树每一行节点值的平均值,最后返回一个数组

2.算法分析

队列+宽搜,每一行求一下平均值即可~

3.算法代码

class Solution {
public:vector<double> averageOfLevels(TreeNode* root) {vector<double> ret;if(root == nullptr)return ret;queue<TreeNode*> q;q.push(root);while(!q.empty()){int sz = q.size();double sum = 0;for(int i = 0; i < sz; i++){auto t = q.front();q.pop(); sum += t->val;if(t->left) q.push(t->left);if(t->right)q.push(t->right);}double avg = sum / sz;ret.push_back(avg);}return ret;}
};

八、最大层内元素和

1161. 最大层内元素和 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/maximum-level-sum-of-a-binary-tree/1.题目解析

返回元素和最大的那一层的层号

2.算法分析

队列+宽搜,求一下每一层的和,后续的层和大于之前的层和,就更新结果,同时记录层号

3.算法代码

class Solution 
{
public:int maxLevelSum(TreeNode* root) {queue<TreeNode*> q;q.push(root);int ret = INT_MIN;int retlevel = 0;int level = 1;while(!q.empty()){int sz = q.size();int sum = 0;while(sz--){auto t = q.front();q.pop(); sum += t->val;if(t->left) q.push(t->left);if(t->right)q.push(t->right);}if(ret < sum){retlevel = level;ret = sum;}level += 1;}return retlevel;}
};

九、二叉树的第K大层和

2583. 二叉树中的第 K 大层和 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/kth-largest-sum-in-a-binary-tree/1.题目解析

求二叉树的第K大层和,如果k > 树的层数,返回-1

2.算法分析

队列 + BFS + 优先级队列

3.算法代码

class Solution {
public:long long kthLargestLevelSum(TreeNode* root, int k) {queue<TreeNode*> q;q.push(root);priority_queue<long long, vector<long long>, less<long long>> heap;while(!q.empty()){int sz = q.size();long long sum = 0;while(sz--){auto t = q.front();q.pop();sum += t->val;if(t->left)q.push(t->left);if(t->right)q.push(t->right);}heap.push(sum);}  if(k > heap.size())return -1;while(--k)heap.pop();return heap.top();}
};

十、反转二叉树的奇数层

2415. 反转二叉树的奇数层 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/reverse-odd-levels-of-binary-tree/1.题目解析

将二叉树的奇数层进行反转,本题的根节点认为是第0层

2.算法分析

队列+BFS(宽搜),用level变量记录层数,如果是奇数层就将该层的节点指针插入到一个vector中,遍历完该层之后,将该层进行反转即可~

3.算法代码

class Solution {
public:TreeNode* reverseOddLevels(TreeNode* root) {queue<TreeNode*> q;q.push(root);int level = 0;vector<TreeNode*> tmp;while(!q.empty()){int sz = q.size();while(sz--){auto t = q.front();q.pop();//奇数层的节点指针插入到tmp中if(level % 2 == 1)tmp.push_back(t);if(t->left)q.push(t->left);if(t->right)q.push(t->right);}//奇数层反转if(level % 2 == 1){int left = 0, right = tmp.size()-1;while(left < right)swap(tmp[left++]->val, tmp[right--]->val);}tmp.clear();level++;}return root;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/689303.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

即插即用篇 | YOLOv8引入PSAModule | 高效金字塔压缩注意力模块

本改进已集成到 YOLOv8-Magic 框架。 最近研究表明,通过在深度卷积神经网络中嵌入注意力模块可以有效地提高网络性能。在这项工作中,提出了一种新的轻量级且有效的注意力方法,名为金字塔挤压注意力(PSA)模块。通过在ResNet的瓶颈块中用PSA模块替换3x3卷积,得到了一种新的…

Python:通过接口获取公众号的文章列表(但是开发文档没有这个接口)

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

QT7_视频知识点笔记_3_自定义控件,事件处理器⭐,定时器,QPainter,绘图设备,不规则窗口

第三天&#xff1a; 自定义控件&#xff0c;事件处理器⭐&#xff0c;定时器&#xff0c;QPainter,绘图设备&#xff0c;不规则窗口实现 1.自定义控件&#xff1a; 创建新的QT控件类&#xff0c;然后再需要使用的地方--》提升为 来使用如何使用基础控件的信号和槽函数&…

静态IP地址怎么维护网络稳定?

在数字化日益深入的今天&#xff0c;网络已经成为我们生活、工作和学习中不可或缺的一部分。而在网络世界中&#xff0c;IP地址扮演着至关重要的角色。其中&#xff0c;静态IP地址以其独特的稳定性和安全性&#xff0c;成为了众多企业和个人用户的首选。 一、静态IP地址的基本概…

通过自建镜像方式搭建RabbitMQ集群

通过自建镜像方式搭建RabbitMQ集群 1. 应用准备1.1 应用目录结构1.2 配置文件1.2.1 .erlang.cookie1.2.2 hosts1.2.3 rabbitmq.conf1.2.4 rabbitmq-env.conf 2. 编写DockerFile2.1 将所有本地文件拷贝到工作目录2.2 拷贝文件到源目录&增加执行权限2.3 安装Erlang & rab…

后端常用技能:基于easy-poi实现excel一对多、多对多导入导出【附带源码】

0. 引言 在业务系统开发中&#xff0c;我们经常遇到excel导入导出的业务场景&#xff0c;普通的excel导入导出我们可以利用 apache poi、jxl以及阿里开源的easyexcel来实现&#xff0c;特别easyexcel更是将excel的导入导出极大简化&#xff0c;但是对于一些负载的表格形式&…

设计模式2——原则篇:依赖倒转原则、单一职责原则、合成|聚合复用原则、开放-封闭原则、迪米特法则、里氏代换原则

设计模式2——设计原则篇 目录 一、依赖倒转原则 二、单一职责原则&#xff08;SRP&#xff09; 三、合成|聚合复用原则&#xff08;CARP&#xff09; 四、开放-封闭原则 五、迪米特法则&#xff08;LoD&#xff09; 六、里氏代换原则 七、接口隔离原则 八、总结 一、依赖…

力扣70 爬楼梯 C语言 动态规划 递归

题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2…

通义灵码企业版正式发布,满足企业私域知识检索、数据合规、统一管理等需求

5 月 9 日阿里云 AI 峰会&#xff0c;阿里云智能集团首席技术官周靖人宣布&#xff0c;通义灵码企业版正式发布&#xff0c;满足企业用户的定制化需求&#xff0c;帮助企业提升研发效率。 通义灵码是国内用户规模第一的智能编码助手&#xff0c;基于 SOTA 水准的通义千问代码模…

QT day5 作业

服务器头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //客户端类 #include <QList> //链表类 #include <QMessageBox> //消息对话框类 #include <QDebu…

论文阅读_RAG融合现有知识树_T-RAG

英文名称: T-RAG: LESSONS FROM THE LLM TRENCHES 中文名称: T-RAG&#xff1a;来自LLM战壕的经验教训 链接: https://arxiv.org/abs/2402.07483 作者: Masoomali Fatehkia, Ji Kim Lucas, Sanjay Chawla 机构: 卡塔尔计算研究所, 哈马德本哈利法大学 日期: 2024-02-12 引用次数…

零基础HTML教程(32)--HTML5语义化标签

文章目录 1. div时代2. div的缺点3. 语义化标签4. 语义化标签有哪些5. 实战演练6. 小结 1. div时代 我是2009年开始学习网页开发的&#xff0c;那时候HTML里面到处是div。 这么说吧&#xff0c;那时候div就是网页的骨架&#xff0c;支撑着网页的主结构。 2. div的缺点 div作…