每日一道算法题--leetcode 437--路径总和III--python

本文针对LeetCode路径总和III问题提供解决方案,介绍如何通过深度优先搜索遍历所有可能路径并计算与目标和匹配的路径数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目描述】

【代码思路】

这道题I和II见我这两篇文章leetcode 113--路径总和IIleetcode 112--路径总和

首先解读题干,题干的要求是找和为sum的路径总数,这次路径的起点和终点不要求是根结点和叶结点,可以是任意起终点,而且结点的数值有正有负,但是要求不能回溯,只能是从父结点到子结点的。在已经做了路径总和一和二的基础上,我们用一个全局变量来保存路径总数量,在主调函数中定义变量self.result=0。

因为数值有正有负,所以在当我们找到一条路径和已经等于sum的时候,不能停止对这条路径的递归,因为下面的结点可能加加减减,再次出现路径和为sum的情况,因此当遇到和为sum的情况时,只需要用self.result+=1把这条路径记住,然后继续向下进行即可。即下面这段代码:

sum1+=root.val
    if sum1==sum:
        self.result+=1
    if root.left:
        self.dfs(root.left,sum1,sum)
    if root.right:
        self.dfs(root.right,sum1,sum)
复制代码

由于路径的起点不一定是根结点,所以需要对这棵树的所有结点都执行一次搜索,就是树的遍历问题,每到一个结点就执行一次dfs去搜索以该结点为起点的路径:

def search(self,root,sum):
    if not root: return 
    self.dfs(root,0,sum)
    self.search(root.left,sum)
    self.search(root.right,sum)
复制代码

在主调函数中,调用search()函数,search函数实现树的遍历。 在search函数中,调用dfs函数,dfs函数实现以某结点为根结点的路径的查找。

【源代码】

# 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 pathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: int
        """
        self.result=0
        self.search(root,sum)
        return self.result
    def search(self,root,sum):
        if not root: return 
        self.dfs(root,0,sum)
        self.search(root.left,sum)
        self.search(root.right,sum)
        
    def dfs(self,root,sum1,sum):
        if not root:return
        sum1+=root.val
        if sum1==sum:
            self.result+=1
        if root.left:
            self.dfs(root.left,sum1,sum)
        if root.right:
            self.dfs(root.right,sum1,sum)
复制代码

有更好思路的话,欢迎交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值