LeetCode 路徑總和 總結

2021-09-25 18:55:47 字數 4151 閱讀 1993

給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。

示例:

輸入:

5/ \

4 8

/ / \

11 13 4

/ \ / \

7 2 5 1

輸出:返回 true, 因為存在目標和為 22 的根節點到葉子節點的路徑 5->4->11->2。

這個問題太簡單了,我們只要搞清楚什麼時候才是葉子節點,這個問題就解決了。當node.left==none and node.right==none的時候,node就是葉子節點。

實現:

class

solution

:def

haspathsum

(self, root,

sum)

:"""

:type root: treenode

:type sum: int

:rtype: bool

"""ifnot root:

return

false

ifnot

(root.left or root.right)

:return

sum== root.val

return self.haspathsum(root.left,

sum- root.val)

or self.haspathsum(root.right,

sum- root.val)

給定乙個二叉樹和乙個目標和,找到所有從根節點到葉子節點路徑總和等於給定目標和的路徑

示例:

輸入:

5/ \

4 8

/ / \

11 13 4

/ \ / \

7 2 5 1

輸出:[

[5,4,11,2],

[5,8,4,5]

]

當訪問的節點是葉子節點的時候,我們新建乙個list,插入到result中,然後返回result。

分別遍歷左右子樹的節點,然後將他們分別插入到葉子節點之前就可以了。

實現:(經典回溯模板問題)

class

solution

(object):

defpathsum

(self, root,

sum)

:"""

:type root: treenode

:type sum: int

:rtype: list[list[int]]

"""# 回溯

ifnot root:

return

res =

self.backtrack(root,

list()

,sum

, res)

return res

defbacktrack

(self, current_node, path, target, res):if

not current_node:

return

none

if current_node.val == target and

not(current_node.left or current_node.right)::

])self.backtrack(current_node.left, path, target-current_node.val, res)

self.backtrack(current_node.right, path, target-current_node.val, res)

path.pop(

)

給定乙個二叉樹,它的每個結點都存放著乙個整數值。

找出路徑和等於給定數值的路徑總數。

路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。

二叉樹不超過1000個節點,且節點數值範圍是 [-1000000,1000000] 的整數。

例項:

root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

10/ \

5 -3

/ \ \

3 2 11

/ \ \

3 -2 1

返回 3。和等於 8 的路徑有:

1. 5 -> 3

2. 5 -> 2 -> 1

3. -3 -> 11

這個問題非常有意思。和之前問題

leetcode 112:路徑總和(最詳細的解法!!!)

leetcode 113:路徑總和 ii(最詳細的解法!!!)

的區別在於,這個問題不一定是從根節點出發。知道這一點的話,我們很容易寫出:

def

pathsum

(self, root,

sum)

:"""

:type root: treenode

:type sum: int

:rtype: int

"""result =0if

not root:

return result

result += self.dfs(root,

sum)

result += self.pathsum(root.left,

sum)

result += self.pathsum(root.right,

sum)

return result

分析:題目要求在以root為根結點的二叉樹中,尋找和為sum的路徑,返回這樣的路徑個數。

我們可以分兩種情況進行遞迴遍歷,

第一種:sum包含當前結點,在他的左右子樹裡面尋找和為sum的路徑數量。遞迴呼叫dfs

第二種:當前結點不包含在sum裡面,直接呼叫pathsum遞迴

實現:

class

solution

(object):

defpathsum

(self, root,

sum)

:"""

:type root: treenode

:type sum: int

:rtype: int

"""result =0if

not root:

return result

result += self.dfs(root,

sum)

# 包含該節點的路徑(就是dfs)

result += self.pathsum(root.left,

sum)

# 不包含該節點的路徑

result += self.pathsum(root.right,

sum)

return result

defdfs(self, node,

sum)

: result =0if

not node:

return result

if node.val ==

sum:

result +=

1 result += self.dfs(node.left,

sum-node.val)

result += self.dfs(node.right,

sum-node.val)

return result

1000 ms, 在所有 python 提交中擊敗了39.14%的使用者太慢了!!!

LeetCode 路徑總和

給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點。示例 給定如下二叉樹,以及目標和 sum 22,5 4 8 11 13 4 7 2 1 如下 definition for a binary tree nod...

LeetCode 路徑總和

給定乙個二叉樹,它的每個結點都存放著乙個整數值。找出路徑和等於給定數值的路徑總數。路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的 只能從父節點到子節點 二叉樹不超過1000個節點,且節點數值範圍是 1000000,1000000 的整數。示例 root 10,5,3,3,2...

leetcode路徑總和問題總結DFS

leetcode 112 一般來說關於dfs有兩個套路 第乙個就是用recursion來完成,這種在理解上著實也不是很簡單,但是一旦理解了,起飛!第二個的話就是用stack來完成iteration,會比上面好理解,但是複雜度會稍微差一點。思路 此題就是乙個明顯的recursion的問題,我們要從ro...