1. 程式人生 > >[python]leetcode(437). Path Sum III

[python]leetcode(437). Path Sum III

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其實用來尋找從根節點開始的路徑和很簡潔、有效,他的思想其實就是把原問題轉化為一個簡單遞迴查詢問題。

但是,它無法儲存中間結果,

這個問題還啟發了我如何把複雜問題轉化為形式簡單的同類型問題,原問題是所有的合法路徑,轉化為所有節點的從根開始的路徑