給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。示例:
這個問題太簡單了,我們只要搞清楚什麼時候才是葉子節點,這個問題就解決了。當輸入:
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)
給定乙個二叉樹和乙個目標和,找到所有從根節點到葉子節點路徑總和等於給定目標和的路徑。示例:
當訪問的節點是葉子節點的時候,我們新建乙個list,插入到result中,然後返回result。輸入:
5/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
輸出:[
[5,4,11,2],
[5,8,4,5]
]
分別遍歷左右子樹的節點,然後將他們分別插入到葉子節點之前就可以了。
實現:(經典回溯模板問題)
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(最詳細的解法!!!)
的區別在於,這個問題不一定是從根節點出發。知道這一點的話,我們很容易寫出:
分析:題目要求在以root為根結點的二叉樹中,尋找和為sum的路徑,返回這樣的路徑個數。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
我們可以分兩種情況進行遞迴遍歷,
第一種: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...