437 路徑總和 III

2021-10-05 22:08:25 字數 3068 閱讀 9750

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

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

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

二叉樹不超過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...