📌  相关文章
📜  来自给定二叉树的最频繁子树和(1)

📅  最后修改于: 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)$,即哈希表所需要的空间。