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
相关文章推荐
- Path Sum III问题及解法
- LeetCode 437. Path Sum III (STL map前缀和)
- 437. Path Sum III
- LeetCode 437 Path Sum III
- Path Sum III
- LeetCode-Path Sum III
- Path Sum III
- 437. Path Sum III
- leetcode#437 Path Sum III
- Path Sum III
- LeetCode——Path Sum III
- Leetcode 437. Path Sum III
- leetcode[437] PathSum III 个人题解
- [LeetCode]437. Path Sum III
- 437. Path Sum III
- Path Sum III
- 437. Path Sum III
- 437. Path Sum III(二叉树的路径和之三)
- LeetCode 437 Path Sum III
- [leetcode]437. Path Sum III