📜  形成 AP 的二叉树中根到叶路径的计数(1)

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

形成 AP 的二叉树中根到叶路径的计数介绍

什么是 AP

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标明。