您的位置:首页 > 其它

Path Sum III

2017-08-15 20:46 141 查看
题目详情: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: