problem
You are given a binary tree in which each node contains an integer
value.Find the number of paths that sum to a given value.
The path does not need to start or end at the root or a leaf, but it
must go downwards (traveling only from parent nodes to child nodes).
solution
pathForm方法是计算从根节点开始的和为某个值的path的个数,如果我们对树中的所有节点都执行这个方法,那么就相当于查找所有路径和为某个值的方法。
class Solution(object):
def pathForm(self, root, val):
if root == None:
return 0
return 1 if root.val == val else 0 +self.pathForm(root.left, val - root.val) + self.pathForm(root.right, val - root.val)
def pathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: int
"""
if root == None:
return 0
else:
return self.pathForm(root, sum) + self.pathSum(root.left, sum) + self.pathSum(root.right, sum)
这里的问题就在于pathSum中其实存在着重复计算,例如在上面的树中,如果计算B到K的路径和,需要从头计算,而如果我们存储下A到K和B到K的路径和的话就只需要
O(1)
的时间了。
总结
对待树一定要有一种递归的思想,就是它的左右子树也还是树,所以非常适用于递归,第一种方法中的pathForm其实用来寻找从根节点开始的路径和很简洁、有效,他的思想其实就是把原问题转化为一个简单递归查找问题。
但是,它无法存储中间结果,
这个问题还启发了我如何把复杂问题转化为形式简单的同类型问题,原问题是所有的合法路径,转化为所有节点的从根开始的路径。