LeetCode 515. 在每个树行中找最大值
字数 1085 2025-12-17 01:36:34
LeetCode 515. 在每个树行中找最大值
题目描述
给定一棵二叉树的根节点 root,请返回一个列表,其中每个元素是该树每一层的最大值。
示例:
输入:root = [1,3,2,5,3,null,9]
输出:[1,3,9]
解释:
1
/ \
3 2
/ \ \
5 3 9
第0层最大值:1
第1层最大值:3
第2层最大值:9
解题过程
目标:逐层遍历树,记录每层的最大值。
关键:需要知道何时进入下一层,因此适合用广度优先搜索(BFS),逐层处理节点。
步骤分解
-
初始化
- 如果根节点为空,直接返回空列表。
- 创建队列(存储当前层节点),先将根节点入队。
- 创建结果列表
result。
-
逐层处理
- 只要队列不为空,说明还有层未处理:
a. 获取当前层的节点数量level_size(即队列当前长度)。
b. 初始化当前层的最大值level_max为一个极小值(如float('-inf'))。
c. 循环level_size次,每次从队列取出一个节点:- 更新
level_max = max(level_max, 节点值)。 - 如果该节点有左子节点,将左子节点入队。
- 如果该节点有右子节点,将右子节点入队。
d. 将level_max加入result。
- 更新
- 只要队列不为空,说明还有层未处理:
-
返回结果
- 遍历结束后,返回
result。
- 遍历结束后,返回
示例推演(以题目示例为例)
- 初始队列:
[1],result = [] - 第0层:
level_size = 1,level_max = -∞- 处理节点
1:level_max = max(-∞, 1) = 1,子节点3、2入队。 - 结束循环,
result = [1]
- 第1层:
- 队列现在为
[3, 2],level_size = 2,level_max = -∞ - 处理节点
3:level_max = max(-∞, 3) = 3,子节点5、3入队。 - 处理节点
2:level_max = max(3, 2) = 3,子节点9入队。 - 结束循环,
result = [1, 3]
- 队列现在为
- 第2层:
- 队列现在为
[5, 3, 9],level_size = 3,level_max = -∞ - 依次处理节点:
- 节点
5:level_max = 5 - 节点
3:level_max = max(5, 3) = 5 - 节点
9:level_max = max(5, 9) = 9
- 节点
- 结束循环,
result = [1, 3, 9]
- 队列现在为
- 队列为空,返回
[1, 3, 9]
复杂度分析
- 时间复杂度:O(n),每个节点访问一次。
- 空间复杂度:O(n),队列最多存储一层节点,最坏情况为 O(n)。