前缀和记录
def pathSum(self, root, targetSum):
"""
:type root: TreeNode
:type targetSum: int
:rtype: int
"""
prefix = collections.defaultdict(int)
prefix[0] = 1
self.res = 0
self.cur = 0
def backtrack(root):
if not root:
return 0
self.cur += root.val
self.res += prefix[self.cur - targetSum]
prefix[self.cur] += 1
backtrack(root.left)
backtrack(root.right)
prefix[self.cur] -= 1
self.cur -= root.val
backtrack(root)
return self.res
暴力dfs
def pathSum(self, root, targetSum):
"""
:type root: TreeNode
:type targetSum: int
:rtype: int
"""
def helper(root,targetSum): #计算以root为起点的路径有多少
if not root:
return 0
res = 0
if root.val == targetSum:
res += 1 #同一条路径上可能含有不止一个的目标值,所以必须搜索完再加一不能直接return
res += helper(root.left,targetSum-root.val)
res += helper(root.right,targetSum-root.val)
return res
if not root:
return 0
res = helper(root,targetSum)
res +=self.pathSum(root.left,targetSum) #这两句是前序遍历所有节点
res +=self.pathSum(root.right,targetSum)
return res