统计值等于子树平均值的节点数-LeetCode
2265. 统计值等于子树平均值的节点数 - Count Nodes Equal to Average of Subtree
🎯 问题描述(来源于LeetCode)
描述:
给定一棵二叉树的根节点 root,返回满足条件的节点数量:该节点的值等于其子树中所有节点值的平均值。
注意:空节点的平均值未定义,不考虑。
说明:
n个元素的平均值可以由n个元素 求和 然后再除以n,并 向下舍入 到最近的整数。root的 子树 由root和它的所有后代组成。
示例:
- 示例 1:
1 | 输入: root = [4,8,5,0,1,null,6] |
- 示例 2:
1 | 输入: root = [1] |
💻 解题思路
思路1:后序遍历 + 返回 (总和, 节点数)
算法步骤
- 全局计数器:
ans记录满足条件的节点数。 - 定义递归函数
dfs(node):- 返回值:元组
(子树节点值总和, 子树节点个数)。 - 递归终止:若
node为None,返回(0, 0)。 - 递归计算左右子树:
(left_sum, left_cnt) = dfs(node.left),(right_sum, right_cnt) = dfs(node.right)。 - 当前子树的总和:
total = node.val + left_sum + right_sum。 - 当前子树的节点数:
cnt = 1 + left_cnt + right_cnt。 - 判断是否满足条件:
node.val == total // cnt(注意:这里使用整数除法,可能不精确,正确做法应为node.val * cnt == total)。 - 若满足,
ans += 1。 - 返回
(total, cnt)。
- 返回值:元组
- 调用
dfs(root),最终返回ans。
思路1:代码实现(用户原始代码)
1 | # Definition for a binary tree node. |
思路1:📊 性能分析
- 时间复杂度:,每个节点访问一次。
- 空间复杂度:,递归栈深度为树高,最坏 。
思考
- 本题的核心是后序遍历同时获取子树和与节点数,自底向上判断。
- 注意平均值可能是浮点数,使用乘法比较可以避免精度问题。
- 也可以使用迭代后序遍历(栈 + 状态标记)实现,但递归更简洁。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






