C++力扣题目-- 二叉树层序遍历

  • 102.二叉树的层序遍历(opens new window)
  • 107.二叉树的层次遍历II(opens new window)
  • 199.二叉树的右视图(opens new window)
  • 637.二叉树的层平均值(opens new window)
  • 429.N叉树的层序遍历(opens new window)
  • 515.在每个树行中找最大值(opens new window)
  • 116.填充每个节点的下一个右侧节点指针(opens new window)
  • 117.填充每个节点的下一个右侧节点指针II(opens new window)
  • 104.二叉树的最大深度(opens new window)
  • 111.二叉树的最小深度

102思路:

我们之前讲过了三篇关于二叉树的深度优先遍历的文章:

  • 二叉树:前中后序递归法(opens new window)
  • 二叉树:前中后序迭代法(opens new window)
  • 二叉树:前中后序迭代方式统一写法(opens new window)

接下来我们再来介绍二叉树的另一种遍历方式:层序遍历。

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。

需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。

使用队列实现二叉树广度优先遍历,动画如下:

102二叉树的层序遍历

这样就实现了层序从左到右遍历二叉树。

代码如下:这份代码也可以作为二叉树层序遍历的模板,打十个就靠它了

c++代码如下:

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {queue<TreeNode*> que;if (root != NULL) que.push(root);vector<vector<int>> result;while (!que.empty()) {int size = que.size();vector<int> vec;// 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的for (int i = 0; i < size; i++) {TreeNode* node = que.front();que.pop();vec.push_back(node->val);if (node->left) que.push(node->left);if (node->right) que.push(node->right);}result.push_back(vec);}return result;}
};

 

107--将102的结果reverse即可;

C++代码:

class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root) {queue<TreeNode*> que;if (root != NULL) que.push(root);vector<vector<int>> result;while (!que.empty()) {int size = que.size();vector<int> vec;for (int i = 0; i < size; i++) {TreeNode* node = que.front();que.pop();vec.push_back(node->val);if (node->left) que.push(node->left);if (node->right) que.push(node->right);}result.push_back(vec);}reverse(result.begin(), result.end()); // 在这里反转一下数组即可return result;}
};

199--二叉树的右视图

层序遍历的时候,判断是否遍历到单层的最后面的元素,如果是,就放进result数组中,随后返回result就可以了。

C++代码:

class Solution {
public:vector<int> rightSideView(TreeNode* root) {vector<int>result;queue<TreeNode*>que;if (root != nullptr) { que.push(root); }while (!que.empty()){int size = que.size();for (int i = 0; i < size; i++){TreeNode* cur = que.front();que.pop();if (i == size - 1) { result.push_back(cur->val); }if (cur->left) { que.push(cur->left); }if (cur->right) { que.push(cur->right); }}}return result;}
};

637--二叉树的层平均值

本题就是层序遍历的时候把一层求个总和在取一个均值。

C++代码:

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

429. N 叉树的层序遍历

这道题依旧是模板题,只不过一个节点有多个孩子了

C++代码:

class Solution {
public:vector<vector<int>> levelOrder(Node* root) {queue<Node*>que;vector<vector<int>>result;if (root != nullptr) { que.push(root); }while (!que.empty()){int size = que.size();vector<int>tmp;for (int i = 0; i < size; i++){Node* cur = que.front();tmp.push_back(cur->val);que.pop();int vsize = cur->children.size();for(int j=0;j<vsize;j++){if (cur->children[j]) {que.push(cur->children[j]);}}}result.push_back(tmp);}return result;}
};

515.在每个树行中找最大值

层序遍历,取每一层的最大值

C++代码:

class Solution {
public:vector<int> largestValues(TreeNode* root) {queue<TreeNode*>que;vector<int>result;if (root != nullptr) { que.push(root); }while (!que.empty()){int max = que.front()->val;int size = que.size();           for (int i = 0; i < size; i++){TreeNode* cur = que.front();if (max < (cur->val)) { max = cur->val; }que.pop();if (cur->left) { que.push(cur->left); }if (cur->right) { que.push(cur->right); }}result.push_back(max);}return result;}
};

116.填充每个节点的下一个右侧节点指针

思路

本题依然是层序遍历,只不过在单层遍历的时候记录一下本层的头部节点,然后在遍历的时候让前一个节点指向本节点就可以了

C++代码:

class Solution {
public:Node* connect(Node* root) {queue<Node*>que;if (root != nullptr) { que.push(root); }while (!que.empty()){int size = que.size();Node* pre;Node* cur;for (int i = 0; i < size; i++){if (i == 0) {pre = que.front();que.pop();cur = pre;}else{cur = que.front();que.pop();pre->next = cur;pre = pre->next;}if (cur->left) { que.push(cur->left); }if (cur->right) { que.push(cur->right); }}pre->next = nullptr;}return root;}
};

117.填充每个节点的下一个右侧节点指针II

思路

这道题目说是二叉树,但116题目说是完整二叉树,其实没有任何差别,一样的代码一样的逻辑一样的味道

C++代码:

class Solution {
public:Node* connect(Node* root) {queue<Node*>que;if (root != nullptr) { que.push(root); }while (!que.empty()){int size = que.size();Node* pre;Node* cur;for (int i = 0; i < size; i++){if (i == 0) {pre = que.front();que.pop();cur = pre;}else{cur = que.front();que.pop();pre->next = cur;pre = pre->next;}if (cur->left) { que.push(cur->left); }if (cur->right) { que.push(cur->right); }}pre->next = nullptr;}return root;}
};

104.二叉树的最大深度

思路

使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。

在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度,如图所示:

层序遍历

所以这道题的迭代法就是一道模板题,可以使用二叉树层序遍历的模板来解决的。

C++代码如下:

class Solution {
public:int maxDepth(TreeNode* root) {queue<TreeNode*>que;int depth = 0;if (root != nullptr) {que.push(root);}while (!que.empty()){int size = que.size();for (int i = 0; i < size; i++){TreeNode* cur = que.front();que.pop();if (cur->left) { que.push(cur->left); }if (cur->right) { que.push(cur->right); }}depth++;}return depth;}
};

111.二叉树的最小深度

思路

相对于 104.二叉树的最大深度 ,本题还也可以使用层序遍历的方式来解决,思路是一样的。

需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。如果其中一个孩子为空则不是最低点

代码如下:(详细注释)

class Solution {
public:int minDepth(TreeNode* root) {queue<TreeNode*>que;int depth = 0;if (root != nullptr){que.push(root);}else {return depth;}                           while (!que.empty()){int size = que.size();depth++;for (int i = 0; i < size; i++){TreeNode* cur = que.front();que.pop();if (cur->left) { que.push(cur->left); }if (cur->right) { que.push(cur->right); }if (cur->left == nullptr && cur->right == nullptr){return depth;}}             }return depth;}
};

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

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

相关文章

openGauss企业版简化安装实战

openGauss企业版简化安装实战 操作系统配置数据库配置安装数据库检查 bilibili同步演示视频&#xff1a;https://www.bilibili.com/video/BV1JW4y1G7BVbilibili视频专栏&#xff1a;https://space.bilibili.com/282421760 操作系统配置 # 创建系统用户 groupadd -g 1008 dbgr…

学习记录9-TFT屏的使用

前言 一、验证连接是否正确 二、更改自己想用的图像 1.取模软件 Image2Lcd 2.9 的使用 2.使用 总结 前言 本文在中景园的代码上改写而来&#xff0c;主要记录下使用记录 一、验证连接是否正确 1.按内容说明进行线路连接 2.运行程序&#xff0c;因为内部有图片样本&…

2024年寒假即将来临 如何实现高质量亲子陪伴?

近日,各地陆续公布了寒假放假时间安排,孩子们期待着迎来一个休闲和轻松的假期。然而,对于许多家长来说,他们也意识到寒假不仅是一个放松的时间,更是一个增进亲子关系的宝贵机会,可以为孩子提供有意义的学习陪伴。 自“双减”政策落地后,学生的课业负担减轻许多,拥有了更多的空余…

3D Web可视化开发工具包HOOPS Communicator:提供Web端浏览大型模型新方案!

前言&#xff1a;HOOPS Communicator是Tech Soft 3D旗下的主流产品之一&#xff0c;具有强大的、专用的高性能图形内核&#xff0c;专注于基于Web的高级3D工程应用程序。其由HOOPS Server和HOOPS Web Viewer两大部分组成&#xff0c;提供了HOOPS Convertrer、Data Authoring的模…

智能合约介绍

莫道儒冠误此生&#xff0c;从来诗书不负人 目录 一、什么是区块链智能合约? 二、智能合约的发展背景 三、智能合约的优势 四、智能合约的劣势 五、一些关于智能合约的应用 总结 一、什么是区块链智能合约? 智能合约&#xff0c;是一段写在区块链上的代码&#xff0c;一…

【重学C语言】一、C语言简介

【重学C语言】一、C语言简介 什么是编程语言&#xff1f;编程语言 C语言发展史C语言标准变迁开发软件CLion安装步骤 VIsual Studio安装步骤 Clion 和 VS2022 绑定 电脑常识 什么是编程语言&#xff1f; 人类语言&#xff1a;语言就是人类进行沟通交流的表达方式&#xff0c;应…

SaaS 电商设计 (六) 实现 id 生成器本地化生产 (附源码)

一.背景 1.1 背景 业务背景: 目前梳理 SaaS 系统中存在以下几种 Id 生成的场景. 财务系统: 财务在生产财务单的时候,获取财务单 Id ,满足分布式场景下能够获取全局Id即可. 支付系统:订单系统在进行外部提单过程中,需要将生成的订单号与外部的支付平台做对接.在具体开发调试…

基于ssm的在线视频网站开发论文

摘 要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&#xff0c;让整个世界都可以即时通话…

高性价比蓝牙耳机有哪些?五款热门高性价比开放式蓝牙耳机推荐

想要一款音质超赞、佩戴舒适、价格又亲民的高性价比蓝牙耳机吗&#xff0c;在这那可就找对地方了&#xff0c;开放式蓝牙耳机就是那种让你在听音乐的同时&#xff0c;还能听到周围环境音的耳机&#xff0c;这种设计让你的听音体验更加舒适&#xff0c;那么哪款开放式蓝牙耳机最…

1688商品采集API实现无货源跨境电商对接教程

随着电子商务的迅猛发展&#xff0c;跨境电商已经成为许多企业和个人的首选商业模式。然而&#xff0c;在跨境交易中&#xff0c;库存和物流管理成为一大难题。为了解决这个问题&#xff0c;我们可以利用1688商品采集API实现无货源跨境电商对接。本文将详细介绍如何通过1688商品…

如何把livp格式转换成jpg?这3个方法简单好用!

如何把livp格式转换成jpg&#xff1f;当我们谈论图像格式的转换&#xff0c;我们实际上是在谈论如何将一种图像数据表示形式转化为另一种形式。将LIVP格式转换为JPG&#xff0c;可以使我们能够更方便地分享和传播图像。因为JPG格式是一种通用的图像格式&#xff0c;被广泛应用于…

【深入理解 ByteBuf 之三 接口类拆解】1. ObjectPool 接口设计剖析

想了一下&#xff0c;我决定还是做更细化的拆解&#xff0c;也看了很多源码剖析的文章1&#xff0c;以及我之前也写过&#xff0c;一个令人难受的点就是通篇的代码解释&#xff0c;通篇没什么头绪&#xff0c;我看着没头绪&#xff0c;感觉写的也没什么头绪&#xff0c;就是在硬…