该题解采用后序遍历的方式递归计算每个子树的元素和,将所有子树元素和保存到一个列表中。然后使用 Counter 统计列表中每个元素和出现的次数,找出出现次数最多的元素和,并返回所有出现次数最多的元素和组成的列表。
时间复杂度: O(nlogn)
空间复杂度: O(n)
from collections import Counter
class Solution:
def findFrequentTreeSum(self, root: Optional[TreeNode]) -> List[int]:
ret = []
if root is None:
return ret
tmp = []
def helper(root):
nonlocal ret
if root is None:
return 0
# 计算当前节点的值
val = root.val
# 递归计算左子树的元素和
val += helper(root.left)
# 递归计算右子树的元素和
val += helper(root.right)
# 将当前子树的元素和添加到列表中
tmp.append(val)
# 返回当前子树的元素和
return val
# 递归遍历二叉树,计算所有子树的元素和
helper(root)
# 使用 Counter 统计每个子树元素和出现的次数
c = Counter(tmp).most_common()
# 获取出现次数最多的元素和的出现次数
largest = c[0][1]
# 遍历 Counter 的结果
for val, times in c:
# 如果当前元素和的出现次数等于最大次数,将其添加到结果列表中
if times == largest:
ret.append(val)
# 如果当前元素和的出现次数小于最大次数,说明后面的元素和出现次数也一定小于最大次数,直接退出循环
else:
break
return ret