📅  最后修改于: 2023-12-03 15:26:34.897000             🧑  作者: Mango
给定一棵二叉树,找出出现次数最多的子树和。如果有多个子树和出现次数相同,则返回其中任意一个即可。
首先我们需要计算每个子树的和,然后使用哈希表将每种和出现的次数记录下来。最后遍历哈希表,找到出现次数最多的子树和,返回即可。
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def findFrequentTreeSum(self, root: TreeNode) -> List[int]:
def treeSum(root: TreeNode):
if not root:
return 0
leftSum = treeSum(root.left)
rightSum = treeSum(root.right)
totalSum = leftSum + rightSum + root.val
if totalSum in sums:
sums[totalSum] += 1
else:
sums[totalSum] = 1
return totalSum
sums = {}
treeSum(root)
maxCount = max(sums.values())
return [key for key in sums.keys() if sums[key] == maxCount]
计算每个子树的和需要遍历整个二叉树,时间复杂度为 $O(n)$。使用哈希表记录每种和出现的次数需要遍历哈希表,时间复杂度为 $O(m)$,其中 $m$ 是哈希表中键的数量,最大可以是 $n$。综上,时间复杂度为 $O(n+m)$。
空间复杂度为 $O(m)$,即哈希表所需要的空间。