《剑指 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;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

仅需5元,手把手教你训练纳西妲GPT-SoVITS模型

资源下载及音频试听&#xff1a; 仅需5元&#xff0c;手把手教你训练纳西妲GPT-SoVITS模型 - 风屿岛 (biliwind.com) 购买服务器 首先&#xff0c;我们需要买一台显卡云服务器 极度推荐使用雨云&#xff0c;优惠码&#xff1a;wp-admin 账户注册成功后&#xff0c;前往&am…

机试复习-4

1.string类 string类型和数值的转换 ※数值→字符串 to_string函数 //具体做法 int i1234; string gto_string(i);//这样就转成字符串1234了 //下面就是字符串转为数字&#xff0c;类似下面还有stof,stoi,stod string d "1289347647"; int j stoi(d); cout <…

2024.2.17 作业

1.终端输入一个字符&#xff0c;判断是大写字母小写字母还是数字字符 代码&#xff1a; #! /bin/bash read var case $var in [0-9]) echo 数字 ;; [[:lower:]]) echo 小写字母 ;; [[:upper:]]) echo 大写字母 …

在 Geoserver 中添加自定义的室内坐标系

要在 Geoserver 中添加自定义的室内坐标系&#xff0c;您需要在数据目录中的 user_projections 文件夹下创建或编辑一个 epsg.properties 文件&#xff0c;然后在文件末尾添加您的坐标系的定义&#xff0c;使用 WKT&#xff08;Well-Known Text&#xff09;格式。您还需要为您的…

一些配置问题记录

真的很感慨 为什么一开始的下载的软件还能用 卸载或重装后的软件总是存在各种各样的错误 真令人心烦 GNURADIO运行简单的采集信号程序报错&#xff0c; 其实不太理解为什么会出现这类错误&#xff0c;解决方法为 安装 jackd2 软件包&#xff0c;然后尝试手动启动 Jack 服务器…

第四节笔记:XTuner 大模型单卡低成本微调实战

视频链接&#xff1a;https://www.bilibili.com/video/BV1yK4y1B75J/?spm_id_from333.788&vd_source3bbd0d74033e31cbca9ee35e111ed3d1 课程笔记&#xff1a; 1.Finetune简介 指令微调&#xff1a; 开始的大模型可能不知道问的是问题 这三种角色的划分只有在微调训练阶…

自动化测试-RIDE编写自动化脚本

自动化脚本是软件测试的必修内容&#xff0c;是自动化测试的核心&#xff0c;脚本的逻辑严谨性、可维护性非常重要&#xff0c;优秀的自动化脚本需要能兼顾用例的正确有效性和自动化测试的效率&#xff0c;本篇文章将介绍如何用RIDE写自动化脚本。我们将深入探讨RIDE的具体用法…

对待不合理需求,前端工程师如何优雅的say no!

曾经有位老板&#xff0c; 每次给前端提需求&#xff0c;前端都说实现不了&#xff0c;后来他搜索了一下&#xff0c;发现网上都有答案。他就在招聘要求上加了条&#xff1a;麻烦你在说不行的时候&#xff0c;搜索一下。 上面是一个段子&#xff0c;说的有点极端了&#xff0c;…

【AIGC】Stable Diffusion的插件入门

一、上文中作者使用插件包的方式下安装插件&#xff0c;用户也可以从Stable Diffusion的界面安装插件&#xff0c;如下图所示&#xff0c;在相应的插件后面点安装按钮。 二、介绍一些比较好用的插件 “adetailer” 插件是 Stable Diffusion 中的一个增强功能&#xff0c;旨在提…

Practical User Research for Enterprise UX

2.1 Why It’s Hard to Get Support for Research in Enterprises 2.1.1 Time and Budget Instead of answering the question “What dowe gain if we do this research?”, ask instead “What do we stand to lose if we don’t do the research?” 2.1.2 Legacy Thinkin…

Flink理论—Flink架构设计

Flink架构设计 Flink 是一个分布式系统&#xff0c;需要有效分配和管理计算资源才能执行流应用程序。它集成了所有常见的集群资源管理器&#xff0c;例如Hadoop YARN&#xff0c;但也可以设置作为独立集群甚至库运行,例如Spark 的 Standalone Mode 本节概述了 Flink 架构&…

QT 信号和槽机制

信号&#xff1a;各种事件 槽&#xff1a; 响应信号的动作 当某个事件发生后&#xff0c;如某个按钮被点击了一下&#xff0c;它就会发出一个被点击的信号&#xff08;signal&#xff09;。 某个对象接收到这个信号之后&#xff0c;就会做一些相关的处理动作&#xff08;称为槽…

LeetCode刷题计划---day3

卡码网 练习ACM模式 https://kamacoder.com/ 11 可用静态链表存储树&#xff0c;最后求某个结点到共同树根的长度。 #include <iostream> #include <vector> using namespace std;int main() {int n;int a,b;vector<int> nums vector<int>(30,0);wh…

Java IO详解

一、流的概念与作用 流(Stream)&#xff1a; 在Java IO中&#xff0c;流是一个核心的概念。流从概念上来说是一个连续的数据传输过程。人们根据数据传输特性将流抽象为各种类&#xff0c;方便更直观的进行数据操作。你既可以从流中读取数据&#xff0c;也可以往流中写数据。流的…

STM32——OLED菜单

文章目录 一.补充二. 二级菜单代码 简介&#xff1a;首先在我的51 I2C里面有OLED详细讲解&#xff0c;本期代码从51OLED基础上移植过来的&#xff0c;可以先看完那篇文章&#xff0c;在看这个&#xff0c;然后按键我是用的定时器扫描不会堵塞程序,可以翻开我的文章有单独的定时…

代码随想录day23--回溯的应用2

LeetCode39.组合总和 题目描述&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates…

RCS系统之:基础算法

设计仓库机器人的控制管理系统涉及到路径规划、任务分配、库存管理、通信系统等方面。以下是一个基本的仓库机器人控制管理系统方案的概述&#xff1a; 路径规划&#xff1a;设计一个路径规划系统&#xff0c;用于确定机器人在仓库内的最佳行驶路径&#xff0c;以最大程度地提…

optee TA文件签名

TA的签名 在optee_os目录下&#xff0c;存放着签名的私钥和签名脚本。 工程目录 optee_os/keys/default_ta.pem 工程目录 optee_os/scripts/sign_encrypt.py 编译TA时会先将TA编译为elf文件。此时执行签名脚本&#xff0c;对elf文件签名并生成.ta文件。 签名使用了RSA2048的 私…

及其详细的Markdown基础-学习笔记(附有使用案例)

Markdown 基础语法 查看更多学习笔记&#xff1a;GitHub&#xff1a;LoveEmiliaForever 标题创建 标题语法格式 在文字前添加一至六个#即可创建标题 标题是有等级的&#xff0c;具体等级根据#个数决定 由于标题等级参与构建整篇文章的架构&#xff0c;编写时应该遵循如下规…

【C++航海王:追寻罗杰的编程之路】string类

目录 1 -> 为什么学习string类&#xff1f; 1.1 -> C语言中的字符串 2 -> 标准库中的string类 2.1 -> string类 2.2 -> string类的常用接口 3 -> string类的模拟实现 3.1 -> 经典的string类问题 3.2 -> 浅拷贝 3.3 -> 深拷贝 3.3.1 ->…