《剑指 Offer》专项突破版 - 面试题 44 : 二叉树中每层的最大值(两种方法 + C++ 实现)

目录

前言

一、只用一个队列

二、使用两个队列


 


前言

题目链接:LCR 044. 在每个树行中找最大值 - 力扣(LeetCode)

题目

输入一棵二叉树,请找出二叉树中每层的最大值。例如,输入下图中的二叉树,返回各层节点的最大值 [3, 4, 9]。

分析

这个题目提到了二叉树的层。既然要找出二叉树中每层的最大值,就要逐层遍历二叉树,也就是说,按照广度优先的顺序遍历二叉树。


一、只用一个队列

由于要找出二叉树中每层的最大值,因此在遍历时需要知道每层什么时候开始、什么时候结束。如果只用一个队列来保存尚未遍历到的节点,那么有可能位于不同的两层的节点同时在队列之中。例如,遍历到节点 4 时,就把节点 4 从队列中取出来,此时节点 2 已经在队列中。接下来要把节点 4 的两个子节点(节点 5 和节点 1)都添加到队列中。这个时候第 2 层的节点 2 和第 3 层的节点 5、节点 1 都在队列中。

如果不同的两层的节点同时位于队列之中,那么每次从队列之中取出节点来遍历时就需要知道这个节点位于哪一层。解决这个问题的一个办法是计数

class Solution {
public:vector<int> largestValues(TreeNode* root) {queue<TreeNode*> q;int curLevelSize = 0;if (root){q.push(root);curLevelSize = 1;}vector<int> result;while (!q.empty()){int max = INT_MIN;while (curLevelSize--){TreeNode* front = q.front();q.pop();if (front->val > max)max = front->val;if (front->left)q.push(front->left);if (front->right)q.push(front->right);}result.push_back(max);curLevelSize = q.size();}return result;}
};


二、使用两个队列

另一个办法是用两个不同的队列 q1 和 q1 分别存放不同的两层的节点,队列 q1 中只放当前遍历层的节点,而队列 q2 中只放下一层的节点

最开始时把二叉树的根节点放入队列 q1 中。接下来每次从队列中取出一个节点遍历。由于队列 q1 用来存放当前遍历层的节点,因此总是从队列 q1 中取出节点用来遍历。如果当前遍历的节点有子节点,则把子节点都放入队列 q2 中

当队列 q1 被清空时,当前层的所有节点都已经被遍历完。通过比较这一层所有节点的值,就能找出这一层所有节点的最大值。在开始遍历下一层之前,把队列 q1 指向队列 q2,并将队列 q2 重新初始化为空的队列。重复这个过程,直到所有节点都遍历完为止

class Solution {
public:vector<int> largestValues(TreeNode* root) {queue<TreeNode*> q1, q2;if (root)q1.push(root);vector<int> result;int max = INT_MIN;while (!q1.empty()){TreeNode* front = q1.front();q1.pop();if (front->val > max)max = front->val;if (front->left)q2.push(front->left);if (front->right)q2.push(front->right);if (q1.empty()){result.push_back(max);max = INT_MIN;q1 = q2;q2 = queue<TreeNode*>();}}return result;}
};

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

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

相关文章

【网工】华为设备命令学习(综合实验一)

实验要求和实验成果如图所示。 LSW2不需要其他配置&#xff0c;其下就一台设备&#xff0c;不需要区分。 LSW3配置如下&#xff1a; <Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]un in en //关闭系统提示信息 Info: Information …

Imgui(1) | 基于imgui-SFML改进自由落体小球

Imgui(1) | 基于imgui-SFML改进自由落体小球 0. 简介 使用 SFML 做2D图形渲染的同时&#xff0c;还想添加一个按钮之类的 GUI Widget, 需要用 Dear Imgui。由于 Imgui 对于2D图形渲染并没有提供类似 SFML 的 API, 结合它们两个使用是一个比较好的方法, 找到了 imgui-SFML 这个…

Java类加载

Java类加载机制是Java虚拟机&#xff08;JVM&#xff09;的一个核心组成部分&#xff0c;它负责将Java类从不同的数据源&#xff08;如本地文件系统、网络等&#xff09;加载到JVM中&#xff0c;并为之生成对应的java.lang.Class对象。理解Java类加载机制对于深入理解Java运行时…

【实战】一、Jest 前端自动化测试框架基础入门(二) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(二)

文章目录 一、Jest 前端自动化测试框架基础入门5.Jest 中的匹配器toBe 匹配器toEqual匹配器toBeNull匹配器toBeUndefined匹配器和toBeDefined匹配器toBeTruthy匹配器toBeFalsy匹配器数字相关的匹配器字符串相关的匹配器数组相关的匹配器异常情况的匹配器 6.Jest 命令行工具的使…

Codeforces Round 925 (Div. 3) D. Divisible Pairs (Java)

Codeforces Round 925 (Div. 3) D. Divisible Pairs (Java) 比赛链接&#xff1a;Codeforces Round 925 (Div. 3) D题传送门&#xff1a;D.Divisible Pairs 题目&#xff1a;D.Divisible Pairs 题目描述 输出格式 For each test case, output a single integer — the num…

MATLAB | 情人节画个花瓣venn图?

之前七夕节情人节各种花&#xff0c;相册&#xff0c;爱心啥的都快画够了&#xff0c;今年画个花瓣韦恩图&#xff1f; 花瓣上的数字是仅属于该类的样本数&#xff0c;而中心的数字是属于每一类的样本数 教程部分 0 数据准备 % 给组起名t1 t2 t3...t15 setName compose(t%d,…

区块链互操作协议

1. 引言 Alexei Zamyatin等人2019年论文 SoK: Communication Across Distributed Ledgers。 参考资料 [1] 2019年论文 SoK: Communication Across Distributed Ledgers [2] A list of blockchain-related SoK papers [3] 2021年视频 FC21: SoK: Communica…

Java 基于 SpringBoot 的大药房管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

QT:实现图片选择器

一、效果图 二、用到的类 qApp&#xff1a;可以快速获取到项目目录位置。 QSettings &#xff1a;编写config文件&#xff0c;记录上次打开图片的位置&#xff0c;下次打开图片会从上次的位置查找图片。 QPixmap&#xff1a;用于图片的缩放&#xff0c;防止图片过小&#xff0…

【电路笔记】-并联电感

并联电感 文章目录 并联电感1、概述2、并联电感示例13、互耦并联电感器4、并联电感示例25、并联电感示例36、总结当电感器的两个端子分别连接到另一个或多个电感器的每个端子时,电感器被称为并联连接在一起。 1、概述 所有并联电感器上的压降将是相同的。 然后,并联的电感器…

JavaScript中有哪些不同的数据类型

在 JavaScript 中&#xff0c;数据类型是一种用来表示数据的分类&#xff0c;它决定了我们可以对这个数据类型执行哪些操作。在 JavaScript 中有以下几种不同的数据类型&#xff1a; 基本数据类型 字符串 (String)&#xff1a;表示一组字符&#xff0c;可以使用引号&#xff08…

【python学习篇1】python基本语法

一、第一个python程序 在控制台上面输出“你好 python”。 在venv目录下面&#xff0c;新建一个Main1.python的文件夹。 然后在文件当中使用print函数输出一句命令即可。 然后&#xff0c;在Main.py下面&#xff0c;右键一下&#xff0c;运行Main1.py&#xff1a;即可看到下…