📅  最后修改于: 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)$。