Title
給定一個二叉樹和一個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。
說明: 葉子節點是指沒有子節點的節點。
示例:
給定如下二叉樹,以及目標和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
返回 true, 因爲存在目標和爲 22 的根節點到葉子節點的路徑 5->4->11->2。
遞歸
Solve
觀察要求我們完成的函數,我們可以歸納出它的功能:詢問是否存在從當前節點 root 到葉子節點的路徑,滿足其路徑和爲 sum。
假定從根節點到當前節點的值之和爲 val,我們可以將這個大問題轉化爲一個小問題:是否存在從當前節點的子節點到葉子的路徑,滿足其路徑和爲 sum - val。
不難發現這滿足遞歸的性質,若當前節點就是葉子節點,那麼我們直接判斷 sum 是否等於 val 即可(因爲路徑和已經確定,就是當前節點的值,我們只需要判斷該路徑和是否滿足條件)。若當前節點不是葉子節點,我們只需要遞歸地詢問它的子節點是否能滿足條件即可。
Code
def hasPathSum(self, root: TreeNode, sum: int) -> bool:
if not root:
return False
if not root.left and not root.right:
return sum == root.val
return self.hasPathSum(root.left, sum - root.val) or self.hasPathSum(root.right, sum - root.val)
複雜度分析
時間複雜度:O(N),其中 N 是樹的節點數。對每個節點訪問一次。
空間複雜度:O(H),其中 H 是樹的高度。空間複雜度主要取決於遞歸時棧空間的開銷,最壞情況下,樹呈現鏈狀,空間複雜度爲 O(N)。平均情況下樹的高度與節點數的對數正相關,空間複雜度爲 O(logN)。