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

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


題目來源:力扣(LeetCode)https://leetcode-cn.com/problems/binary-tree-maximum-path-sum

題目


給定一個非空二叉樹精堕,返回其最大路徑和砸王。

本題中馆揉,路徑被定義為一條從樹中任意節(jié)點出發(fā),達(dá)到任意節(jié)點的序列管挟。該路徑至少包含一個節(jié)點占锯,且不一定經(jīng)過根節(jié)點。

示例 1:

輸入: [1,2,3]

       1
      / \
     2   3

輸出: 6

示例 2:

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

   -10
   / \
  9  20
    /  \
   15   7

輸出: 42

解題思路


思路:遞歸

題目中所給出的路徑概念是指【一條從樹中任意節(jié)點出發(fā)挺身,達(dá)到任意節(jié)點的序列豆励。該路徑至少包含一個節(jié)點,且不一定經(jīng)過根節(jié)點】瞒渠。

也就是說良蒸,要求出路徑和,得計算節(jié)點能提供的最大貢獻(xiàn)值伍玖。

對于節(jié)點能提供的貢獻(xiàn)值嫩痰,分為如下部分:

  • 空節(jié)點提供的貢獻(xiàn)值為 0;
  • 對于非空節(jié)點提供的貢獻(xiàn)值窍箍,等于當(dāng)前節(jié)點的值與其子節(jié)點中提供最大貢獻(xiàn)值的和串纺。

現(xiàn)在以示例 1 來分析說明下:

輸入: [1,2,3]

       1
      / \
     2   3

在這里葉子節(jié)點 2,3,能提供的貢獻(xiàn)值就是 2椰棘, 3纺棺。

而葉子節(jié)點 1,能夠提供的貢獻(xiàn)值為 1+21+3邪狞。

那我們假設(shè):如果節(jié)點 1 前面還有父節(jié)點祷蝌,那么這里可能的路徑就會變成:

  • 2 + 1 + 3
  • 2 + 1 + 1 的父節(jié)點
  • 3 + 1 + 1 的父節(jié)點

其中第一種情況,就是求節(jié)點的最大路徑和帆卓。這里節(jié)點的最大路徑和取決于該節(jié)點與其左右子節(jié)點的最大貢獻(xiàn)值之和巨朦。當(dāng)然,在這里剑令,如果子節(jié)點的貢獻(xiàn)值為負(fù)糊啡,則選擇不納入。因為負(fù)數(shù)的貢獻(xiàn)值添加進(jìn)來反而會讓結(jié)果變小吁津。

對于第二種和第三種情況來說棚蓄,這里就是遞歸求得左右子節(jié)點的貢獻(xiàn)值,從中取更優(yōu)的方案。

這里最主要的就是維護一個存儲最大路徑和的變量 max_path_sum梭依,遞歸的過程中維護更新這個值挣柬,從而求得最大值。

具體的代碼實現(xiàn)如下睛挚。

代碼實現(xià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 __init__(self):
        # 存儲最大路徑和
        self.max_path_sum = float('-inf')

    def maxPathSum(self, root: TreeNode) -> int:
        def max_contr(node):
            # 遞歸求節(jié)點最大貢獻(xiàn)值
            # 同時維護經(jīng)過節(jié)點的最大路徑和
            # 空節(jié)點的貢獻(xiàn)值為 0
            if not node:
                return 0

            # 遞歸計算左子節(jié)點的貢獻(xiàn)值邪蛔,
            left = max(0, max_contr(node.left))
            # 遞歸計算右子節(jié)點的貢獻(xiàn)值
            right = max(0, max_contr(node.right))

            # 經(jīng)過當(dāng)前節(jié)點的最大路徑和
            self.max_path_sum = max(self.max_path_sum, left + node.val + right)

            # 當(dāng)前節(jié)點的貢獻(xiàn)值,取左右子節(jié)點中的更優(yōu)方案
            node_contr = node.val + max(0, max(left, right))
            # 這里返回的貢獻(xiàn)值是給當(dāng)前節(jié)點的上游節(jié)點
            return node_contr

        max_contr(root)
        return self.max_path_sum

實現(xiàn)結(jié)果


實現(xiàn)結(jié)果

總結(jié)


  • 從題目中得到的信息可以知道扎狱,要求最大路徑和侧到,需要求得節(jié)點能夠提供的貢獻(xiàn)值。
  • 對于節(jié)點而言淤击,提供的貢獻(xiàn)值分為兩部分:
    • 空節(jié)點的貢獻(xiàn)值為 0匠抗;
    • 對于非空節(jié)點而言,當(dāng)前節(jié)點能提供的貢獻(xiàn)值為當(dāng)前節(jié)點的值與其子節(jié)點中能提供的最大貢獻(xiàn)值之和
  • 對于非空節(jié)點而言污抬,我們需要遞歸的方法求得每個節(jié)點的貢獻(xiàn)值汞贸。同時,需要維護最大路徑和印机,在這里矢腻,該節(jié)點的路徑和取決于當(dāng)前節(jié)點的值與其左右子節(jié)點的最大貢獻(xiàn)值。
  • 這里需要注意:當(dāng)貢獻(xiàn)值為負(fù)時射赛,不計入節(jié)點的最大路徑和多柑。

文章原創(chuàng),如果覺得寫得還好楣责,歡迎關(guān)注點贊竣灌。微信公眾號《書所集錄》同步更新,同樣歡迎關(guān)注點贊秆麸。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末初嘹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子沮趣,更是在濱河造成了極大的恐慌屯烦,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兔毒,死亡現(xiàn)場離奇詭異漫贞,居然都是意外死亡,警方通過查閱死者的電腦和手機育叁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芍殖,“玉大人豪嗽,你說我怎么就攤上這事。” “怎么了龟梦?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵隐锭,是天一觀的道長。 經(jīng)常有香客問我计贰,道長钦睡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任躁倒,我火速辦了婚禮荞怒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秧秉。我一直安慰自己褐桌,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布象迎。 她就那樣靜靜地躺著荧嵌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砾淌。 梳的紋絲不亂的頭發(fā)上啦撮,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音汪厨,去河邊找鬼逻族。 笑死,一個胖子當(dāng)著我的面吹牛骄崩,可吹牛的內(nèi)容都是我干的聘鳞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼要拂,長吁一口氣:“原來是場噩夢啊……” “哼抠璃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脱惰,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤搏嗡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拉一,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體采盒,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年蔚润,在試婚紗的時候發(fā)現(xiàn)自己被綠了磅氨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡嫡纠,死狀恐怖烦租,靈堂內(nèi)的尸體忽然破棺而出延赌,到底是詐尸還是另有隱情,我是刑警寧澤叉橱,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布挫以,位于F島的核電站,受9級特大地震影響窃祝,放射性物質(zhì)發(fā)生泄漏掐松。R本人自食惡果不足惜粪小,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一大磺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糕再,春花似錦量没、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至猾担,卻和暖如春袭灯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绑嘹。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工稽荧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人工腋。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓姨丈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親擅腰。 傳聞我的和親對象是個殘疾皇子蟋恬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345