Path Sum III

题目详情:https://leetcode.com/problems/path-sum-iii/description/
一开始想到的解法类似于解法一,但是没能实现[衰]。
解法一:
暴力破解,写法简单


class Solution(object):
    def pathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: int
        """
        if root!=None:
            #self.find_paths(root,sum)是以root为树的根节点遍历树
            #self.pathSum(root.left,sum)以root.left作为根节点,然后遍历
            #self.pathSum(root.right,sum)以root.right作为根节点,然后遍历
            #在递归的过程又会以各个节点,即以root为根节点的树中,每个节点都会以根节点的身份遍历,以该节点为根节点的树
            return self.find_paths(root,sum)+self.pathSum(root.left,sum)+self.pathSum(root.right,sum)
        return 0
    def find_paths(self,root,target):
        if root!=None:
            #root.val==target,返回True,int(True)返回1;int(False)返回0
            #self.find_paths(root.left,target-root.val),访问左孩子,target-root.val表示要路径和为target还需要(target-root.val)
            #self.find_paths(root.right,target-root.val),访问右孩子,target-root.val表示要路径和为target还需要(target-root.val)
            #返回的值由三部分组成,当前的路径和是否等于target,左子树的路径和等于target的条数,右子树上路径和等于target的条数
            return int(root.val==target)+self.find_paths(root.left,target-root.val)+self.find_paths(root.right,target-root.val)
        return 0

解法二:

class Solution(object):
    def pathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: int
        """
        so_far=0#存储从根节点到某个节点的路径的和
        self.ans=0#存储答案
        d={0:1}#存储路径和
        self.inOrder(root,so_far,sum,d)#中序遍历
        return self.ans#返回结果
    def inOrder(self,root,so_far,target,d):
        if root:
            #如果complement为负数,表示so_far+root.val还差abs(complement),需要将当前的so_far+root.val往下加上abs(complement)
            #或者将前边加上的某个负数减掉,以使so_far+root.val变大,以使so_far+root.val==target。因为d中保存了前边路径中的和,如果
            #complement等于前从根节点到某个节点的路径和,那么只需要减掉该段路径和即可,然后从该节点到目前访问的节点就为target的值
            #如果complement为正数,那么表示多了abs(complement),处理过程和上边类似
            complement=so_far+root.val-target#到从根节点和该节点的路径和与target和的差,并存储在complement中
            if complement in d and d[complement]!=0:#查看complement是否在在d中
                print root.val,d
                self.ans+=d[complement]#则将结果加上d[complement]
            #以下的语句主要用于存储路径和
            d.setdefault(so_far+root.val,0)#如果路径和不存在,将会添加键并将值设为默认值;如果存在返回以前有过的值,不存在的话返回默认的值
            d[so_far+root.val]+=1#将d[so_far+root.val]的值加1,表示路径和为so_far+root.val的路径又多了一条
            self.inOrder(root.left,so_far+root.val,target,d)#遍历左节点
            self.inOrder(root.right,so_far+root.val,target,d)#遍历右节点
            d[so_far+root.val]-=1#即将结束遍历该节点,路径和为so_far+root.val的路径条数减少1,所以d[so_far+root.val]的值减1
        return
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值