路径总和 III
给定一个二叉树,它的每个结点都存放着一个整数值。
找出路径和等于给定数值的路径总数。
路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
方法一: 双重递归——双重递归的操作需要从每个节点开始进行类似的计算,所以第一个递归用来遍历这些节点,第二个递归用来处理这些节点,进行深度优先搜索
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def __init__(self):
self.res = 0
def pathSum(self, root, targetSum):
"""
:type root: TreeNode
:type targetSum: int
:rtype: int
"""
#双重递归:双重递归的操作需要从每个节点开始进行类似的计算,所以第一个递归用来遍历这些节点,第二个递归用来处理这些节点,进行深度优先搜索
if not root:
return 0
self.dfs(root, targetSum)
self.pathSum(root.left, targetSum)
self.pathSum(root.right, targetSum)
return self.res
def dfs(self, root, target):
if not root:
return
#注意:必须把target -= root.val放在if target == 0:
target -= root.val
if target == 0:
self.res += 1
self.dfs(root.left, target)
self.dfs(root.right, target)
方法二: 输出不对,不知道哪里错了
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def __init__(self):
self.res = 0
def pathSum(self, root, targetSum):
"""
:type root: TreeNode
:type targetSum: int
:rtype: int
"""
# #双重递归:双重递归的操作需要从每个节点开始进行类似的计算,所以第一个递归用来遍历这些节点,第二个递归用来处理这些节点,进行深度优先搜索
# if not root:
# return 0
# self.dfs(root, targetSum)
# self.pathSum(root.left, targetSum)
# self.pathSum(root.right, targetSum)
# return self.res
# def dfs(self, root, target):
# if not root:
# return
# #注意:必须把target -= root.val放在if target == 0:
# target -= root.val
# if target == 0:
# self.res += 1
# self.dfs(root.left, target)
# self.dfs(root.right, target)
#这里输出不对,不知道哪里出错了
pre_sum_hash = collections.defaultdict(int)
# pre_sum_hash[0] = 1
pre_sum = 0
# res = 0
def dfs(root, pre_sum_hash, pre_sum):
if not root:
return
pre_sum += root.val
self.res += pre_sum_hash[pre_sum - targetSum]
pre_sum_hash[pre_sum] += 1
dfs(root.left, pre_sum_hash, pre_sum)
dfs(root.right, pre_sum_hash, pre_sum)
pre_sum -= root.val
pre_sum_hash[pre_sum] -= 1
dfs(root, pre_sum_hash, pre_sum)
return self.res