该题解采用了递归的方式进行深度优先搜索(DFS)。对于每个节点,首先递归计算其左右子树内所有节点的值的和以及节点个数。然后,将当前节点的值加到子树的和中,并将节点个数加一,从而获取包括当前节点在内的整个子树的总和和节点个数。接着,计算子树的平均值并向下取整,如果这个值等于当前节点的值,则结果计数器增加。最后,函数返回当前子树的节点数量和值的总和,以供上层节点的计算。
时间复杂度: O(n)
空间复杂度: O(n) in the worst case, O(log(n)) in average case for balanced trees
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def averageOfSubtree(self, root: TreeNode) -> int:
res = 0 # 初始化满足条件的节点数量为0
def search(node):
if not node:
return 0, 0 # 如果节点为空,返回节点数和总和都为0
cnt, sums = 1, node.val # 初始化当前节点的计数和总和
if node.left: # 如果有左子节点
t1, t2 = search(node.left) # 递归计算左子树
cnt += t1 # 更新节点总数
sums += t2 # 更新值的总和
if node.right: # 如果有右子节点
t1, t2 = search(node.right) # 递归计算右子树
cnt += t1 # 更新节点总数
sums += t2 # 更新值的总和
if (sums // cnt) == node.val: # 如果当前节点值等于其子树的平均值
nonlocal res
res += 1 # 结果计数器增加
return cnt, sums # 返回当前子树的节点数和总和
search(root) # 从根节点开始搜索
return res # 返回满足条件的节点总数