leetcode124 二叉樹中的最大路徑和

2021-09-29 09:37:22 字數 1541 閱讀 5707

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

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

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