leetcode 437 路徑總和 III

2021-09-29 05:55:29 字數 1682 閱讀 1151

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

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

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

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

真尷尬,居然看不懂19年底自己寫的解題思路了。。。只能刪掉重來

這道題雖然和路徑總和、路徑總和 ii是系列題,但是有一點變化:判斷cur_sum == target_sum的地方不再侷限於葉子節點了,而是所有節點皆有可能。這個就很能讓人聯想到陣列中,求和為xx的子陣列(eg: 和為k的子陣列),也就是典型的字首和的題目,只不過這裡的陣列是樹的一條從根節點出發的路徑。

時間複雜度o(n

)o(n)

o(n)

,比原先的思路(雖然沒看懂)速度快了不少

# 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,0)

] pre_sum_dict =

cur_sum =

0 path_cnt =

0while stack:

p, stat = stack.pop(

)if stat ==0:

(p,1))

cur_sum += p.val

if(cur_sum -

sum)

in pre_sum_dict:

path_cnt += pre_sum_dict[cur_sum -

sum]

pre_sum_dict[cur_sum]

= pre_sum_dict.get(cur_sum,0)

+1if p.left:

(p.left,0)

)if p.right:

(p.right,0)

)else

: pre_sum_dict[cur_sum]-=1

cur_sum -= p.val

return path_cnt

Leetcode 437 路徑總和 III

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

LeetCode 437 路徑總和 III

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

leetcode 437 路徑總和 III

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