[python]leetcode(437). Path Sum III
阿新 • • 發佈:2019-01-28
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的路徑和的話就只需要 (1)
總結
對待樹一定要有一種遞迴的思想,就是它的左右子樹也還是樹,所以非常適用於遞迴,第一種方法中的pathForm其實用來尋找從根節點開始的路徑和很簡潔、有效,他的思想其實就是把原問題轉化為一個簡單遞迴查詢問題。
但是,它無法儲存中間結果,
這個問題還啟發了我如何把複雜問題轉化為形式簡單的同類型問題,原問題是所有的合法路徑,轉化為所有節點的從根開始的路徑。