https://leetcode-cn.com/problems/path-sum-iii
暴力求解,耗时较长。注意代码中的pathSum函数表示从root向下,取任一点出发到任一点结束状况下路径和为sum的路径个数;而get_path函数表示从node出发,到任一点结束状况下路径和为sum的路径个数。所以,从根节点出发的pathSum等于从根节点出发的get_path加上分别从左右子树出发的pathSum。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def pathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: int
"""
count = 0
if not root:
return count
return self.get_path(root, sum) + \
self.pathSum(root.left, sum) + self.pathSum(root.right, sum)
def get_path(self, node, num):
cnt = 0
if node.val == num:
cnt += 1
if node.left:
cnt += self.get_path(node.left, num-node.val)
if node.right:
cnt += self.get_path(node.right, num-node.val)
return cnt
上面的解答耗时太久,可以把重复子问题的求解优化下。
class Solution:
def pathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: int
"""
self.res = 0
if not root:
return 0
log = {0:1} # 记录之前路径和
self.dfs(root, 0, log, sum)
return self.res
def dfs(self, root, root_sum, log, sum):
if root:
root_sum += root.val
self.res += log.get(root_sum-sum, 0)
log[root_sum] = log.get(root_sum, 0) + 1
self.dfs(root.left, root_sum, log, sum)
self.dfs(root.right, root_sum, log, sum)
log[root_sum] -= 1