一、题目描述
题目链接:力扣 515. 在每个树行中找最大值
题目描述:
给你一棵二叉树的根节点,请你找出每一层的最大值,并按层的顺序返回这些最大值组成的数组。
示例 1:
输入:root = [1,3,2,5,3,null,9]
输出:[1,3,9]
示例 2:
输入:root = [1,2,3]
输出:[1,3]
提示:
树中节点数目在范围 [0, 10⁴] 内
-2³¹ <= Node.val <= 2³¹ - 1
三、算法原理
本题的核心算法是'基于队列的 BFS 分层遍历 + 层内最大值统计',在基础层序遍历的框架上,仅增加'层内最大值初始化'和'逐节点值比较更新最大值'两步操作,逻辑清晰且易于理解。
- 初始化一个队列,把二叉树的根节点入队(若根节点为空,直接返回空结果)。
- 初始化一个结果数组,用于存储每一层的最大值。
- 当队列不为空时,执行以下操作:
- 记录当前队列的大小(即当前层的节点数 n)。
- 初始化当前层的最大值变量 max_val 为整型最小值(INT_MIN),确保能覆盖所有节点值的边界情况。
- 循环 n 次,依次取出队列头部的节点:
- 将当前节点值与 max_val 比较,更新 max_val 为两者中的较大值。
- 若节点有左子节点,将左子节点入队;若有右子节点,将右子节点入队(为下一层遍历做准备)。
- 将当前层的最大值 max_val 加入结果数组。
- 队列为空时,遍历完成,返回最终结果数组。
这个思路的本质是:用 BFS 完成分层遍历,在遍历每一层的过程中同步统计最大值,以最小的代码改动适配'层内找最大值'的需求。
模拟过程
我们用示例 1 完整模拟,帮你直观理解每一步的队列状态和最大值统计过程。
场景:示例 1 二叉树 [1,3,2,5,3,null,9]
初始状态:
- 队列 q = [1]
- 最终结果 ret = []
| 步骤 | 队列状态 | 当前层节点数 (n) | 当前层最大值 (max_val) | 节点值比较过程 | ret 变化 |
|---|---|---|---|---|---|
| 1 | [1] | 1 | 1 | 1 → max_val=1 | [1] |
| 2 | [3,2] | 2 | 3 | 3→max_val=3 → 2→max_val 保持 3 | [1,3] |
| 3 | [5,3,9] | 3 | 9 | 5→max_val=5 → 3→max_val 保持 5 → 9→max_val=9 | [1,3,9] |
| 4 | [] | 0 | - | 队列空,结束遍历 | 不变 |
细节注意
- 最大值初始化:必须用 INT_MIN(需包含
<climits>头文件)初始化,不能用 0,否则无法正确处理全负数的二叉树(比如节点值为 [-5,-3,-8] 的情况)。


