news 2026/11/4 16:24:49

DeepSeek LeetCode 515. 在每个树行中找最大值 Java实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek LeetCode 515. 在每个树行中找最大值 Java实现

LeetCode 515. 在每个树行中找最大值 · Java 实现

题意

给定二叉树根节点 root,返回每一层节点的最大值组成的列表(从上到下)。

示例:

1 / \ 3 2 / \ \ 5 3 9

输出:[1, 3, 9]


思路一:BFS 层序遍历(推荐)

核心:逐层遍历,每层用一个变量记录最大值,遍历完该层后加入结果。

importjava.util.*;classSolution{publicList<Integer>largestValues(TreeNoderoot){List<Integer>res=newArrayList<>();if(root==null)returnres;Queue<TreeNode>queue=newArrayDeque<>();queue.offer(root);while(!queue.isEmpty()){intsize=queue.size();intmax=Integer.MIN_VALUE;// 注意:初始值不能是 0for(inti=0;i<size;i++){TreeNodenode=queue.poll();max=Math.max(max,node.val);if(node.left!=null)queue.offer(node.left);if(node.right!=null)queue.offer(node.right);}res.add(max);}returnres;}}

关键点:

· 用 size 锁定当前层节点数,一次循环处理一层。
· max 初始化为 Integer.MIN_VALUE,因为节点值可能为负,不能用 0。


思路二:DFS 记录每层最大值

用 depth 作为层号,res 的下标即层号。第一次到达某层时先占位,之后与当前层最大值比较。

classSolution{publicList<Integer>largestValues(TreeNoderoot){List<Integer>res=newArrayList<>();dfs(root,0,res);returnres;}privatevoiddfs(TreeNodenode,intdepth,List<Integer>res){if(node==null)return;if(depth==res.size()){res.add(node.val);// 第一次到达该层,直接加入}else{res.set(depth,Math.max(res.get(depth),node.val));}dfs(node.left,depth+1,res);dfs(node.right,depth+1,res);}}

DFS 的时间也是 O(n),空间取决于树高 O(h)。和 BFS 相比,代码更短,但"层号 == 列表长度"的判定是重点。


两种方法对比

方法 时间 空间 特点
BFS 层序 O(n) O(w)(最大层宽) 最直观,面试首选
DFS 前序 O(n) O(h)(树高) 代码短,需理解"层号 == 长度"判定

最坏空间都是 O(n)。DFS 在链状树时只占 O(h) = O(n) 的递归栈(比 BFS 的 O(1) 宽还占得多一些),BFS 在满二叉树时占 O(n/2)。实际差异不大。


关键坑点 ⚠️

  1. max 初始值必须是 Integer.MIN_VALUE,不能是 0
    · 节点值可能全是负数,初始化 0 会得到错误的 0。
    · 也可用该层第一个节点的值初始化。
  2. 空树要提前返回空列表
    · root == null 时直接 return res;,否则 queue.offer(null) 会抛 NPE(ArrayDeque 不允许 null)。
  3. 必须用 size 锁定当前层
    · while (!queue.isEmpty()) 中每次取 queue.size() 的快照,否则边入队边判断会打乱层级。
  4. DFS 版本中 depth == res.size() 的判定
    · 含义:“第一次到达第 depth 层”。
    · 用 depth >= res.size() 也行,但 == 更精确(因为 DFS 深度每次只 +1,不可能跳跃)。
  5. 别把每层的 max 写进循环外
    · max 必须在每层开始时重新初始化,否则会跨层污染。
  6. ArrayDeque 作为 Queue 用,不支持 offer(null)
    · 左右孩子入队前判断 != null。
  7. 返回值是 List,元素顺序是"从上到下"
    · BFS 天然满足;DFS 用层号下标也能保证顺序正确。

一句话总结

BFS 逐层扫,size 定边界,每层取 max(初始 Integer.MIN_VALUE),是本题最标准也最不易错的写法。DFS 也能做,靠"层号 == 列表长度"来第一次占位,之后的节点更新该层最大值。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/4 16:22:43

139-杨逢昌:周检复盘标准化操作指南(归位三定闭环法现场实战)

《6S管理实战专栏》 三环实战篇&#xff08;第139篇&#xff09; 杨逢昌使命&#xff1a; 用6S的力量&#xff0c;让10万名朋友实现高效愉悦的生活与工作。一、痛点问题现象&#xff1a;很多车间主管的周巡查只走形式&#xff0c;墙面、标牌、临时物料这些细节空白点没人审核&a…

作者头像 李华
网站建设 2026/11/4 16:22:14

dockerfile如何快速构建容器(java服务)

常见的Docker容器构建方式&#xff0c;就是基于现有的docker的基础镜像&#xff0c;在此基础上添加一些容器启动的命令和程序包文件&#xff0c;然后使用docker build镜像生成&#xff0c;常见的基础镜像&#xff0c;可以在docker的国内镜像源地址进行下载&#xff0c;以下就是…

作者头像 李华
网站建设 2026/11/4 16:06:53

Windows 冗余驱动怎么找、怎么删:Driver Store Explorer 新手实操

Windows 冗余驱动怎么找、怎么删&#xff1a;Driver Store Explorer 新手实操 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer Windows 用了好几年&#xff0c;驱动仓库悄悄吃掉好几个 G…

作者头像 李华
网站建设 2026/11/4 15:44:01

如何快速部署Hermes Agent:5步搭建你的AI智能助手系统 [特殊字符]

如何快速部署Hermes Agent&#xff1a;5步搭建你的AI智能助手系统 &#x1f680; 你是否想过拥有一个能够自我学习、跨平台协作的AI助手&#xff1f;Hermes Agent正是这样一个开源AI代理工具&#xff0c;它能从经验中创建技能、在使用中不断改进&#xff0c;并为你提供无缝的智…

作者头像 李华