給定乙個二叉樹,它的每個結點都存放著乙個整數值。
找出路徑和等於給定數值的路徑總數。
路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。
二叉樹不超過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 的路徑有:
5 -> 3
5 -> 2 -> 1
-3 -> 11
通過次數32,178提交次數58,710
在真實的面試中遇到過這道題?
# definition for a binary tree node.
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class
solution
:def
pathsum
(self, root: treenode,
sum:
int)
->
int:
ifnot root:
return
0 stack=
[(root,
[root.val])]
res=
0while stack:
node,temp=stack.pop(
) res+=temp.count(
sum)
# temp+=[0]
if node.left:
n_temp=
[i+node.left.val for i in temp]
(node.left,n_temp)
)if node.right:
n_temp=
[i+node.right.val for i in temp]
(node.right,n_temp)
)return res
就是乙個前序遍歷,記錄到達沒餓過節點的所有路徑的長度,
遍歷到你該結點的時候看一下經過該節點的路徑長度等於sum的個數,加到res裡面
# definition for a binary tree node.
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class
solution
:def
pathsum
(self, root: treenode,
sum:
int)
->
int:
defhelper
(root):if
not root:
return
l=helper(root.left)
r=helper(root.right)
paths=
[i+root.val for i in
(l+r)]+
[root.val]
self.count+=paths.count(
sum)
return paths
self.count =
0 helper(root)
return self.count
用遞迴的思想來做,對於每個節點找出來該節點往下的路徑一共有多少
從這些路徑中找到路徑和等於sum的個數
# definition for a binary tree node.
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class
solution
:def
pathsum
(self, root: treenode,
sum:
int)
->
int:
ht=self.count=
0def
helper
(node,prefixsum,ht):if
not node:
return
prefixsum+=node.val
if prefixsum-
sumin ht:
self.count+=ht[prefixsum-
sum]
ht[prefixsum]
=ht.get(prefixsum,0)
+1# ht[prefixsum] = ht[prefixsum] + 1 if prefixsum in ht else 1
helper(node.left,prefixsum,ht)
helper(node.right,prefixsum,ht)
ht[prefixsum]-=1
helper(root,
0,ht)
return self.count
總體還是乙個前序遍歷,
字典ht儲存前面路徑到每個點的路徑長,我們用到當前路徑的長度減去到路徑上前面的點的長度,就可以得到路徑上任意兩點之間的路徑長
每到乙個節點就看下,但到當前節點的路徑的符合長度的有多少記錄一下。
437 路徑總和 III
給定乙個二叉樹,它的每個結點都存放著乙個整數值。找出路徑和等於給定數值的路徑總數。路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的 只能從父節點到子節點 二叉樹不超過1000個節點,且節點數值範圍是 1000000,1000000 的整數。示例 root 10,5,3,3,2...
437 路徑總和 III
給定乙個二叉樹,它的每個結點都存放著乙個整數值。找出路徑和等於給定數值的路徑總數。路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的 只能從父節點到子節點 二叉樹不超過1000個節點,且節點數值範圍是 1000000,1000000 的整數。示例 root 10,5,3,3,2...
437 路徑總和 III
和112 113題類似 不過這一題更難一些,需要進行雙重遞迴 即對每個節點做遞迴,再以該節點為起點進行dfs,搜尋滿足條件的路徑 class solution object def init self self.count 0 def pathsum self,root,sum if not roo...