[python]leetcode(437). Path Sum III

problem

You are given a binary tree in which each node contains an integer
value.

Find the number of paths that sum to a given value.

The path does not need to start or end at the root or a leaf, but it
must go downwards (traveling only from parent nodes to child nodes).

solution

pathForm方法是计算从根节点开始的和为某个值的path的个数,如果我们对树中的所有节点都执行这个方法,那么就相当于查找所有路径和为某个值的方法。

class Solution(object):
    def pathForm(self, root, val):
        if root == None:
            return 0
        return 1 if root.val == val else 0 +self.pathForm(root.left, val - root.val) + self.pathForm(root.right, val - root.val)
    def pathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: int
        """
        if root == None:
            return 0
        else:
            return self.pathForm(root, sum) + self.pathSum(root.left, sum) + self.pathSum(root.right, sum)

这里写图片描述
这里的问题就在于pathSum中其实存在着重复计算,例如在上面的树中,如果计算B到K的路径和,需要从头计算,而如果我们存储下A到K和B到K的路径和的话就只需要 O(1) 的时间了。

总结

对待树一定要有一种递归的思想,就是它的左右子树也还是树,所以非常适用于递归,第一种方法中的pathForm其实用来寻找从根节点开始的路径和很简洁、有效,他的思想其实就是把原问题转化为一个简单递归查找问题。

但是,它无法存储中间结果,

这个问题还启发了我如何把复杂问题转化为形式简单的同类型问题,原问题是所有的合法路径,转化为所有节点的从根开始的路径

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值