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.該節點 左子樹路徑 ...