1. 问题理解与需求拆解
今天我们来解决LeetCode 637题——二叉树的层平均值。这道题看似简单,但其中蕴含着对二叉树遍历和数据处理的基本功考察。题目要求我们计算二叉树每一层节点的平均值,并以数组形式返回结果。
核心需求:给定一个非空二叉树的根节点root,返回一个数组,其中每个元素代表对应层节点的平均值。需要注意的是,结果需要保留5位小数,且与实际答案相差不超过10^-5的答案都被认为是正确的。
示例分析:
- 示例1中的输入
[3,9,20,null,null,15,7]表示如下二叉树:
code复制 3
/ \
9 20
/ \
15 7
- 第0层(根节点层)只有节点3,平均值自然是3.0
- 第1层有节点9和20,平均值是(9+20)/2=14.5
- 第2层有节点15和7,平均值是(15+7)/2=11.0
边界条件考虑:
- 单节点树:返回仅包含该节点值的数组
- 完全不平衡树(如所有节点只有左子树或只有右子树)
- 节点值包含极大或极小整数(-2^31到2^31-1)
- 节点数量上限(10^4个节点)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路与算法选择
解决这个问题最直观的思路是使用广度优先搜索(BFS),也就是层序遍历。这是因为题目要求按层处理节点,而BFS天然适合这种分层处理的需求。
为什么选择BFS而不是DFS?
- BFS使用队列实现,可以自然地按层处理节点
- DFS虽然也能实现分层,但需要额外记录节点层级信息,实现起来更复杂
- BFS的时间复杂度与DFS相同(都是O(n)),但BFS的空间复杂度在最坏情况下(完全平衡树)更好
算法步骤分解:
- 初始化队列,将根节点放入队列
- 当队列不为空时:
a. 记录当前队列长度(即当前层的节点数)
b. 遍历当前层的所有节点,计算它们的值之和
c. 将每个节点的非空子节点加入队列
d. 计算当前层平均值并加入结果列表 - 返回结果列表
时间复杂度分析:
- 每个节点被访问一次,所以时间复杂度是O(n),n是节点数量
- 空间复杂度取决于队列中最多存储的节点数,最坏情况下(完全平衡树)是O(n)
3. 代码实现与细节解析
让我们仔细分析给出
