給定乙個非空二叉樹,返回其最大路徑和。對於樹中的每個點,遞迴計算完左右子樹後,我們將左右子樹維護的兩條最大路徑,和該點拼接起來,就可以得到以這個點為割點的最大路徑。本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。
示例 1:
輸入: [1,2,3]
1/ \
2 3
輸出: 6
示例 2:
輸入: [-10,9,20,null,null,15,7]
-10/ \
9 20
/ \
15 7
輸出: 42
對於每個結點來說,要知道經過其左孩子結點的 path 之和大還是經過右孩子節點的 path 之和大,遞迴函式dfs儲存較大的path和值作為這個節點的返回值。遞迴函式返回值就可以定義為以當前結點為根結點,到葉節點的最大路徑之和(左側路徑或者右側路徑)。
在遞迴函式中,如果當前結點不存在,直接返回0。否則就分別對其左右子節點呼叫遞迴函式,由於路徑和有可能為負數,這裡當然不希望加上負的路徑和,所以和0相比,取較大的那個,就是要麼不加,加就要加正數。然後來更新全域性最大值結果 res,就是以左子結點為終點的最大 path 之和加上以右子結點為終點的最大 path 之和,還要加上當前結點值,這樣就組成了乙個條完整的路徑。而返回值是取 left 和 right 中的較大值加上當前結點值,因為返回值的定義是以當前結點為終點的 path 之和,所以只能取 left 和 right 中較大的那個值,而不是兩個都要。
# definition for a binary tree node.
# class treenode(object):
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
import sys
class solution(object):
def __init__(self):
self.ans=-sys.maxsize
def dfs(self,root):
if not root:
return 0
# 如果該節點為負數,相當於不要這個節點
left=max(0,self.dfs(root.left))
right=max(0,self.dfs(root.right))
self.ans=max(self.ans,left+right+root.val)
return max(left,right)+root.val
def maxpathsum(self, root):
""":type root: treenode
:rtype: int
"""self.dfs(root)
return self.ans
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.該節點 左子樹路徑 ...