112. Path Sum 路徑總和

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)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章