📅  最后修改于: 2023-12-03 15:39:33.195000             🧑  作者: Mango
AP(等差数列)是指每个后一项与前一项的差值相等的数列。比如:1, 3, 5, 7就是一个公差为2的等差数列。
给定一个二叉树,计算从根节点到叶子节点所经过的节点值形成的等差数列的数量。注意是要求路径的节点数大于等于 2 个。
我们可以利用深度优先搜索的方法来解决该问题。遍历二叉树,每当遇到一个节点时,我们可以以该节点为结束节点,向上遍历计算所有以该节点为结束节点的路径中,形成等差数列的数量。
具体来说,我们可以从底向上对每个节点维护一个哈希表,该哈希表中存储从该节点开始,不同公差的等差数列数量。对于每个节点,我们将其子节点的哈希表合并到自身的哈希表中,并统计以当前节点为结束节点,形成等差数列的数量。
class Solution:
def __init__(self):
self.ans = 0
def dfs(self, node):
# 特判
if not node:
return {}
# 左右子节点的哈希表
left = self.dfs(node.left)
right = self.dfs(node.right)
# 当前节点的哈希表
count = {0: 1} # 存储公差为0的等差数列数量
for k in left:
d = node.val - k
count[d] = count.get(d, 0) + left[k] # 更新当前节点的哈希表
for k in right:
d = node.val - k
count[d] = count.get(d, 0) + right[k] # 更新当前节点的哈希表
# 统计路径数量
for k in count:
if k != 0 and count[k] > 0:
self.ans += count[k]
return count
def countArithmeticSlices(self, root: TreeNode) -> int:
self.dfs(root)
return self.ans
代码片段已按markdown标明。