LeetCode-python 面试题 04.12. 求和路径

题目链接
难度:中等       类型: DFS, 前缀和


给定一棵二叉树,其中每个节点都含有一个整数数值(该值或正或负)。设计一个算法,打印节点数值总和等于某个给定值的所有路径的数量。注意,路径不一定非得从二叉树的根节点或叶节点开始或结束,但是其方向必须向下(只能从父节点指向子节点方向)。

示例

解题思路


最朴素的思路以每一个结点为开始,遍历所有路径,这会有很多重复计算,当前节点到根节点的和可以记录下来,即前缀和

代码实现

基本的dfs解法

class Solution:
    def pathSum(self, root: TreeNode, sum: int) -> int:
         
        def dfs(node, cur_sum):
            cnt = 0
            if node is None:
                return 0
            cur_sum += node.val
            if cur_sum == sum:
                cnt += 1

            cnt += dfs(node.left, cur_sum)
            cnt += dfs(node.right, cur_sum)
            return cnt

        if root is None:
            return 0
      
        cnt = dfs(root, 0)

        cnt += self.pathSum(root.left, sum)
        cnt += self.pathSum(root.right, sum)
     
        return cnt

加入前缀和的dfs

class Solution:
    def pathSum(self, root: TreeNode, sum: int) -> int:
        prefix_sum = collections.defaultdict(int)
        prefix_sum[0] = 1
        def dfs(node, cur_sum):
            cnt = 0
            if node is None:
                return 0
            cur_sum += node.val
            cnt += prefix_sum[cur_sum - sum]
            prefix_sum[cur_sum] += 1
            cnt += dfs(node.left, cur_sum)
            cnt += dfs(node.right, cur_sum)
            # 唯一的关键点在于,退出当前结点时,需要删除当前节点的记录
            prefix_sum[cur_sum] -= 1
            return cnt

        if root is None:
            return 0
 
        return dfs(root, 0)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容