面试算法44:二叉树中每层的最大值
题目
输入一棵二叉树,请找出二叉树中每层的最大值。例如,输入图7.4中的二叉树,返回各层节点的最大值[3,4,9]。

分析:用一个队列实现二叉树的广度优先搜索
由于要找出二叉树中每层的最大值,因此在遍历时需要知道每层什么时候开始、什么时候结束。如果还是和前面一样只用一个队列来保存尚未遍历到的节点,那么有可能位于不同的两层的节点同时在队列之中。例如,遍历到节点4时,就把节点4从队列中取出来,此时节点2已经在队列中。接下来要把节点4的两个子节点(节点5和节点1)都添加到队列中。这个时候第2层的节点2和第3层的节点5、节点1都在队列中。
如果不同层的节点同时位于队列之中,那么每次从队列之中取出节点来遍历时就需要知道这个节点位于哪一层。解决这个问题的一个办法是计数。需要注意的是,当遍历某一层的节点时,会将下一层的节点也放入队列中。因此,可以用两个变量分别记录两层节点的数目,变量current记录当前遍历这一层中位于队列之中节点的数目,变量next记录下一层中位于队列之中节点的数目。
解:用一个队列实现二叉树的广度优先搜索
public class Test {public static void main(String[] args) {TreeNode node3 = new TreeNode(3);TreeNode node4 = new TreeNode(4);TreeNode node2 = new TreeNode(2);TreeNode node5 = new TreeNode(5);TreeNode node1 = new TreeNode(1);TreeNode node9 = new TreeNode(9);node3.left = node4;node3.right = node2;node4.left = node5;node4.right = node1;node2.right = node9;List<Integer> result = largestValues(node3);System.out.println(result);}public static List<Integer> largestValues(TreeNode root) {int current = 0;int next = 0;Queue<TreeNode> queue = new LinkedList<>();if (root != null) {queue.offer(root);current = 1;}List<Integer> result = new LinkedList<>();int max = Integer.MIN_VALUE;while (!queue.isEmpty()) {TreeNode node = queue.poll();current--;max = Math.max(max, node.val);if (node.left != null) {queue.offer(node.left);next++;}if (node.right != null) {queue.offer(node.right);next++;}if (current == 0) {result.add(max);max = Integer.MIN_VALUE;current = next;next = 0;}}return result;}
}
分析:用两个队列实现二叉树的广度优先搜索
当遍历某一层时,会将位于下一层的子节点也插入队列中,也就是说,队列中会有位于两层的节点。可以用两个不同的队列queue1和queue2分别存放两层的节点,队列queue1中只放当前遍历层的节点,而队列queue2中只放下一层的节点。
当队列queue1被清空时,当前层的所有节点都已经被遍历完。通过比较这一层所有节点的值,就能找出这一层所有节点的最大值。在开始遍历下一层之前,把队列queue1指向队列queue2,并将队列queue2重新初始化为空的队列。重复这个过程,直到所有节点都遍历完为止。
解:用两个队列实现二叉树的广度优先搜索
public class Test {public static void main(String[] args) {TreeNode node3 = new TreeNode(3);TreeNode node4 = new TreeNode(4);TreeNode node2 = new TreeNode(2);TreeNode node5 = new TreeNode(5);TreeNode node1 = new TreeNode(1);TreeNode node9 = new TreeNode(9);node3.left = node4;node3.right = node2;node4.left = node5;node4.right = node1;node2.right = node9;List<Integer> result = largestValues(node3);System.out.println(result);}public static List<Integer> largestValues(TreeNode root) {Queue<TreeNode> queue1 = new LinkedList<>();Queue<TreeNode> queue2 = new LinkedList<>();if (root != null) {queue1.offer(root);}List<Integer> result = new LinkedList<>();int max = Integer.MIN_VALUE;while (!queue1.isEmpty()) {TreeNode node = queue1.poll();max = Math.max(max, node.val);if (node.left != null) {queue2.offer(node.left);}if (node.right != null) {queue2.offer(node.right);}if (queue1.isEmpty()) {result.add(max);max = Integer.MIN_VALUE;queue1 = queue2;queue2 = new LinkedList<>();}}return result;}
}
相关文章:
面试算法44:二叉树中每层的最大值
题目 输入一棵二叉树,请找出二叉树中每层的最大值。例如,输入图7.4中的二叉树,返回各层节点的最大值[3,4,9]。 分析:用一个队列实现二叉树的广度优先搜索 由于要找出二叉树中每层的最大值,因…...
JWT的头部、载荷和签名分别包含哪些信息?
JWT(JSON Web Token)由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。每个部分都是经过Base64编码的JSON字符串。 1:头部(Header): 头部通常包含两个信息:令牌类型(typ)和所用的加密算法(alg)。令牌类型(typ)指示该令牌类型为JWT。加密算法(…...
【烧火柴问题】奇思妙想火柴
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
C++数据结构算法篇Ⅰ
C数据结构算法篇Ⅰ 📟作者主页:慢热的陕西人 🌴专栏链接:C算法 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 主要内容讲解数据结构中的链表结构 文章目录 C数据…...
Python selenium获取元素信息
视频版教程:一天掌握python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium 主要text属性和三个方法get_attribute(),get_property(),get_dom_attribute() text属性获取元素的文本信息; get_attribute(),ge…...
测试Winsock的select
说明 实现了一个回显一行字符串的服务器:客户端发送一行字符串,一’\n’结尾,服务器接受完一行后就原封不动地发回给客户端。 windows下对select的能监控的Socket数量是有限制的,若超过,一种方案是再开一个线程。 #i…...
CentOS 搭建 Hadoop3 高可用集群
Hadoop FullyDistributed Mode 完全分布式 spark101spark102spark103192.168.171.101192.168.171.102192.168.171.103namenodenamenodejournalnodejournalnodejournalnodedatanodedatanodedatanodenodemanagernodemanagernodemanagerrecource managerrecource managerjob hist…...
ModuleNotFoundError: No module named ‘paddle.fluid.incubate.fleet‘
在使用rocketqa的时候可能会遇到下面的问题: 问题: 解决方法: 这完全是paddlepaddle的问题。 在rocketqa/utils/optimization.py出现下面的语句,这个时候直接把出错的注释掉就可以,因为它完全没有用到。(…...
【Java】Java中的引用类型
强引用(StrongReference) 通过new直接创建的对象,只要该对象还可以被其它对象使用或访问到,就不会被回收 软引用(SoftReference) 引用一个对象,该对象在系统内存溢出不足时,会自动…...
File类、方法递归
File:代表文本 IO流:读写数据 1、 File 类构建对象的方式是什么样的? File 的对象可以代表哪些东西? 注意 File 对象既可以代表文件、也可以代表文件夹。 ● File 封装的对象仅仅是一个路径名,这个路径可以是存在的,…...
MySQL - 系统库之 sys
sys 系统库用于管理和监控MySQL服务器的性能和运行状态: 用途: 性能监控和分析:sys 系统库用于监控MySQL服务器的性能和资源利用情况。它提供了各种视图和函数,用于分析查询性能、资源利用、等待事件等方面的数据。性能调优&…...
GoLong的学习之路(十七)基础工具之Gin框架使用JWT(前后端分离)
文章目录 JWT安装JWT使用什么是Claims默认Claims自定义Claims生成JWT解析JWT 在gin框架中使用JWT获取Token渠道定义方法设置中间件注册路由 总结一下 JWT JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式&a…...
【代码数据】2023粤港澳大湾区金融数学建模B题分享
基于中国特色估值体系的股票模型分析和投资策略 首先非常建议大家仔细的阅读这个题的题目介绍,还有附赠的就是那个附件里的那几篇材料,我觉得你把这些内容读透理解了,就可以完成大部分内容。然后对于题目里它主要第一部分给出了常用的估值模…...
大数据之LibrA数据库系统告警处理(ALM-12006 节点故障)
告警解释 Controller按30秒周期检测NodeAgent状态。当Controller连续三次未接收到某个NodeAgent的状态报告时,产生该告警。 当Controller可以正常接收时,告警恢复。 告警属性 告警ID 告警级别 可自动清除 12006 严重 是 告警参数 参数名称 参…...
poi兴趣点推荐数据集介绍
介绍 foursquare数据集包含2153471个用户,1143092个场所,1021970个签到,27098490个社交关系以及用户分配给场所的2809581评级,我们常用的是根据NYC和TKY都是从该数据集中抽取出来的。 下载地址:https://sites.google.…...
把两个4点的结构相加
( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点,训练集中只有5张图片,让A中有4个1,B全是0,排列组合,统计迭代次数并排序。 其中有3个结构 3差值结构 迭代次数 4差值结构 迭代次数 31 3-2 0 1 …...
windows内存取证-中等难度-下篇
上文我们对第一台Target机器进行内存取证,今天我们继续往下学习,内存镜像请从上篇获取,这里不再进行赘述 Gideon 攻击者访问了“Gideon”,他们向AllSafeCyberSec域控制器窃取文件,他们使用的密码是什么? 攻击者执…...
代码随想录算法训练营第7天|454 四数相加II 383. 赎金信 15.三数之和 18 四数之和
JAVA代码编写 454. 四数相加 II 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1:…...
负载均衡深度解析:算法、策略与Nginx实践
引言 如今,网站和应用服务面临着巨大的访问流量,如何高效、稳定地处理这些流量成为了一个亟待解决的问题。负载均衡技术因此应运而生,它通过将流量合理分配到多个服务器上,不仅优化了资源的利用率,还大大提升了系统的…...
7. 一文快速学懂常用工具——Makefile
本章讲解知识点 引言MakefileMakefile 入门本专栏适合于软件开发刚入职的学生或人士,有一定的编程基础,帮助大家快速掌握工作中必会的工具和指令。本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。如专栏内容有错漏,欢迎在评论区指出或私聊我更改,一起学习,共同…...
哈夫曼树:高效压缩数据的秘密武器
引言在前面的树系列中,我们学习了二叉搜索树、AVL 树和红黑树——它们都是为了高效查找而设计的。今天要讲的哈夫曼树,目的完全不同:它是为了压缩数据而生。哈夫曼树(Huffman Tree),又称最优二叉树…...
Burp Suite实操避坑指南:从抓包失败到漏洞验证的完整链路
1. 这不是又一本“Burp Suite入门指南”,而是一份我亲手调试过37次配置、在真实客户环境里跑通21个靶场、被5个刚转行的安全新人追着问细节的实操手记你点开这个标题,大概率正站在两个路口之间:一边是满屏英文弹窗、Proxy拦截失败、Repeater发…...
通过Hermes Agent对接Taotoken自定义模型提供方
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过Hermes Agent对接Taotoken自定义模型提供方 Hermes Agent是一个流行的AI Agent开发框架,它支持通过统一的接口调用…...
m4s-converter终极指南:3步解锁B站缓存视频的离线观看自由
m4s-converter终极指南:3步解锁B站缓存视频的离线观看自由 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经在B站缓存了心爱…...
【Java EE】IPv6
IPv6引言IPv6 地址表示IPv6 地址类型地址范围详解多播地址结构IPv6 与 IPv4 的主要区别IPv6 首部格式扩展首部IPv6 地址配置方式无状态地址自动配置(SLAAC)有状态配置(DHCPv6)手动配置邻居发现协议(NDP)IPv…...
Gemini企业社会责任实践白皮书(2024独家解密版):覆盖AI伦理、碳足迹追踪与社区赋能的3层合规架构
更多请点击: https://codechina.net 第一章:Gemini企业社会责任实践白皮书(2024独家解密版)概览 本白皮书首次系统披露Google Gemini大模型在2024年度面向环境可持续性、AI伦理治理、数字包容性及社区赋能四大维度的企业社会责任…...
CoreSight MTB-M33勘误文档解析与嵌入式开发实践
1. CoreSight MTB-M33 勘误文档解析作为一名长期从事嵌入式开发的工程师,我深知芯片勘误文档(Errata Notice)在实际项目中的重要性。今天要讨论的这份CoreSight MTB-M33勘误文档,是每个使用Cortex-M33处理器的开发者都必须仔细研读…...
终极指南:如何用novel-downloader小说下载器批量保存网络小说
终极指南:如何用novel-downloader小说下载器批量保存网络小说 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 你是否曾遇到过这种情况:熬夜追更的小说突然从网…...
3步搞定!电子课本下载终极指南:免费获取PDF教材的完整教程
3步搞定!电子课本下载终极指南:免费获取PDF教材的完整教程 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内…...
DeepSeek-R1长上下文实战瓶颈突破:从OOM崩溃到98.7%上下文利用率提升的7步调优流程
更多请点击: https://kaifayun.com 第一章:DeepSeek-R1长上下文处理的核心挑战与价值重定义 DeepSeek-R1在支持长达128K tokens的上下文窗口时,并非仅靠简单扩大KV缓存实现,其核心挑战深植于内存带宽瓶颈、注意力计算复杂度爆炸与…...
