Leetcode 124 二叉樹中的最大路徑和

2021-09-26 18:34:22 字數 1567 閱讀 4087

time: 20190901

type: hard

給定乙個非空二叉樹,返回其最大路徑和。

本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。

示例 1:

輸入: [1,2,3]

1

/ \ 2

3

輸出: 6

示例 2:

輸入: [-10,9,20,null,null,15,7]

-

10/ \

920/ \

157

輸出: 42

一般樹會從根結點到葉子結點,可以很直觀想到用遞迴,回溯的思路來解,遞迴出口也很方便寫出來。

本題是非常靈活的,從任意結點出發到任意結點,且不一定要經過根。

結點的值並沒有規定說是非負數。

拿到這個問題,感覺不是很有思路。

難以從巨集觀角度思考問題時,可以考慮專注到乙個結點上進行思考,如果這個結點在最終的路徑上呢?要滿足什麼樣的條件?

有條件就能降低搜尋空間,降低搜尋空間,問題往往可以得解。

# definition for a binary tree node.

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class

solution

:def

maxpathsum

(self, root: treenode)

->

int:

res =

float

('-inf'

)def

maxpath

(node)

:nonlocal res # 外層巢狀定義變數

ifnot node:

return

0 left =

max(

0, maxpath(node.left)

) right =

max(

0, maxpath(node.right)

) res =

max(res, left + right + node.val)

return

max(left, right)

+ node.val

maxpath(root)

return res

這裡有非常重要的一點是,遞迴時,向父節點回溯返回的是子樹的單邊最大,即max(left, right) + node.val,這是因為站在當前結點考慮,如果返回的是子樹的左右結點,那路徑就不是我們要的單條線,而是帶分叉的了。

如果子樹最大值是負數,則不要子樹了,因為子樹對求和沒有大貢獻。

leetcode 687 最長同值路徑

LeetCode 124 二叉樹中的最大路徑和

給定乙個非空二叉樹,返回其最大路徑和。本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。示例 1 輸入 1,2,3 1 2 3 輸出 6示例 2 輸入 10,9,20,null,null,15,7 10 9 20 15 7 輸出 42本題與 ...

Leetcode 124 二叉樹中的最大路徑和

題目 給定乙個非空二叉樹,返回其最大路徑和。本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。示例 1 輸入 1,2,3 1 2 3輸出 6 示例 2 輸入 10,9,20,null,null,15,7 10 9 20 15 7 輸出 42 ...

leetcode124 二叉樹中的最大路徑和

參考 思路參考 參考 class solution return the max value ended at root node inthelp treenode root 分析1給定乙個非空節點,最終路徑經過這個節點有4種情況 1.只有該節點本身 左右子樹的路徑都是負數 2.該節點 左子樹路徑 ...