📌  相关文章
📜  当除以 K 时,其子节点给出相同余数的节点数(1)

📅  最后修改于: 2023-12-03 15:25:36.656000             🧑  作者: Mango

计算子节点相同余数的节点数

在一棵树上,我们可以通过一个祖先节点除以一个数字 K,得到一个余数,那么这个祖先节点的子节点中,有多少个节点的除以 K 得到的余数也是上述那个余数呢?这就是我们要解决的问题。

我们可以通过遍历整棵树,对每个节点进行处理,维护一个余数数组 count,表示当前节点除以 K 得到的余数出现的次数。对于一个当前节点的子节点,若该子节点的余数与当前节点相同,则给 count 数组中对应余数位置加一。

最后,我们可以遍历整棵树,对每个节点的 count 数组进行统计,即可得到除以 K 时,其子节点给出相同余数的节点数。

下面是实现代码:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def __init__(self):
        self.count = defaultdict(int)

    def subtreeSame(self, root, k):
        """
        :type root: TreeNode
        :type k: int
        :rtype: int
        """
        self.dfs(root, k)
        ans = 0
        for key in self.count:
            cnt = self.count[key]
            ans += cnt * (cnt - 1) // 2
        return ans

    def dfs(self, node, k):
        if not node:
            return []
        res = [node.val % k]
        res.extend(self.dfs(node.left, k))
        res.extend(self.dfs(node.right, k))
        for r in res:
            self.count[r] += 1
        return res

时间复杂度:$O(n)$,其中 $n$ 为树中节点的数量。空间复杂度:$O(n)$。