二叉樹 6 (二叉樹中的最大路徑和 leetcode 124)

思想

二叉樹的核心思想是分治和遞歸毫深,特點(diǎn)是遍歷方式坡疼。
解題方式常見兩類思路:

  1. 遍歷一遍二叉樹尋找答案不恭;
  2. 通過分治分解問題尋求答案歌憨;

遍歷分為前中后序着憨,本質(zhì)上是遍歷二叉樹過程中處理每個(gè)節(jié)點(diǎn)的三個(gè)特殊時(shí)間點(diǎn):

  1. 前序是在剛剛進(jìn)入二叉樹節(jié)點(diǎn)時(shí)執(zhí)行;
  2. 后序是在將要離開二叉樹節(jié)點(diǎn)時(shí)執(zhí)行务嫡;
  3. 中序是左子樹遍歷完進(jìn)入右子樹前執(zhí)行甲抖;
# 前序
     1 node
    /      \
 2 left   3 right
中左右
 
# 中序
     2 node
    /      \
 1 left    3 right
左中右
 
# 后序
     3 node
    /      \
 1 left    2 right     
左右中       

多叉樹只有前后序列遍歷,因?yàn)橹挥卸鏄溆形ㄒ灰淮沃虚g節(jié)點(diǎn)的遍歷

題目的關(guān)鍵就是找到遍歷過程中的位置心铃,插入對(duì)應(yīng)代碼邏輯實(shí)現(xiàn)場(chǎng)景的目的准谚。

實(shí)例

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

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

輸入:
root: TreeNode,二叉樹的根節(jié)點(diǎn)

輸出:
int去扣,返回二叉樹中的最大路徑和柱衔,路徑是指從樹中任意節(jié)點(diǎn)出發(fā),沿父-子節(jié)點(diǎn)連接愉棱,達(dá)到任意節(jié)點(diǎn)的序列唆铐,且同一個(gè)節(jié)點(diǎn)在同一路徑中至多出現(xiàn)一次。路徑和指的是路徑中各個(gè)節(jié)點(diǎn)值的總和奔滑。

舉例:
給定二叉樹 [-10,9,20,null,null,15,7]
路徑包括:
9
9 -> -10
9 -> -10 -> 20
9 -> -10 -> 20 -> 7
9 -> -10 -> 20 -> 15
-10
-10 -> 20
-10 -> 20 -> 15
-10 -> 20 -> 7
20
20 -> 15
20 -> 7
15
15 -> 20 -> 7
要注意艾岂,最大路徑和不一定是最長(zhǎng)路徑,例如上面的最大路徑和是 15 + 20 + 7 = 42朋其。

二叉樹的數(shù)據(jù)存儲(chǔ)可以使用鏈表王浴,也可以使用數(shù)組,往往數(shù)組更容易表達(dá)梅猿,根節(jié)點(diǎn)從 index=1 處開始存儲(chǔ)氓辣,浪費(fèi) index=0 的位置
left_child = 2 * parent
right_child = 2 * parent + 1
parent = child // 2

  -10
  / \
 9  20
    / \
   15   7

分治解

從根節(jié)點(diǎn)開始,先簡(jiǎn)化問題粒没,有三種路徑形成方式:

  1. 左右子樹的最大路徑和都小于 0筛婉,這時(shí)只取根節(jié)點(diǎn)簇爆,是最大路徑和癞松;
  2. 左子樹的最大路徑和小于 0,此時(shí)最大路徑和的路徑是:根節(jié)點(diǎn) + 右子樹的最大路徑和所經(jīng)過的路徑入蛆;
  3. 右子樹的最大路徑和小于 0响蓉,此時(shí)最大路徑和的路徑是:根節(jié)點(diǎn) + 左子樹的最大路徑和所經(jīng)過的路徑;

上例來看:

  • 從根節(jié)點(diǎn) -10 出發(fā)哨毁,左子樹最大路徑和是 9枫甲,右子樹是 20 + 15 = 35,當(dāng)下最大路徑和是 -10 + 9 + 35 = 34;
  • -10.left=9想幻,從 9 出發(fā)粱栖,左右子樹都是空,所以當(dāng)下最大路徑和是 9脏毯;
  • -10.right=20闹究,從 20 出發(fā),左子樹最大路徑和是 15食店,右子樹最大路徑和是 7渣淤,當(dāng)下最大路徑和是 15 + 20 + 7 = 42;
  • 20.left=15吉嫩,從 15 出發(fā)价认,左右子樹都是空,所以當(dāng)下最大路徑和是 15自娩;
  • 20.right=7用踩,從 7 出發(fā),左右子樹都是空忙迁,所以當(dāng)下最大路徑和是 7捶箱;

全局最大路徑和是 42

編碼


from typing import Optional


class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


def binary_tree_maximum_path_sum(root: Optional[TreeNode]) -> int:
    max_sum  = None

    def max_path_sum(root: Optional[TreeNode]) -> int:
        # 初始條件,空時(shí)返回 0
        if root is None:
            return 0
        # 判斷左右子樹最大值动漾,如果小于 0 則路徑不選擇左右子樹的節(jié)點(diǎn)
        left_max = max(0, max_path_sum(root.left))
        right_max = max(0, max_path_sum(root.right))
        # 更新全局最大值
        nonlocal max_sum
        if max_sum is None:
            max_sum = root.val + left_max + right_max
        else:
            max_sum = max(root.val + left_max + right_max, max_sum)
        # 返回當(dāng)前遍歷的最大值丁屎,一定包含 root 節(jié)點(diǎn),并選擇左右子樹較大的一個(gè)
        return root.val + max(left_max, right_max)

    max_path_sum(root)
    return max_sum

相關(guān)

二叉樹 0
二叉樹 1
二叉樹 2
二叉樹 3
二叉樹 4
二叉樹 5

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旱眯,一起剝皮案震驚了整個(gè)濱河市晨川,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌删豺,老刑警劉巖共虑,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異呀页,居然都是意外死亡妈拌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蓬蝶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尘分,“玉大人,你說我怎么就攤上這事丸氛∨喑睿” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵缓窜,是天一觀的道長(zhǎng)定续。 經(jīng)常有香客問我谍咆,道長(zhǎng),這世上最難降的妖魔是什么私股? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任摹察,我火速辦了婚禮,結(jié)果婚禮上倡鲸,老公的妹妹穿的比我還像新娘港粱。我一直安慰自己,他們只是感情好旦签,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布查坪。 她就那樣靜靜地躺著,像睡著了一般宁炫。 火紅的嫁衣襯著肌膚如雪偿曙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天羔巢,我揣著相機(jī)與錄音望忆,去河邊找鬼。 笑死竿秆,一個(gè)胖子當(dāng)著我的面吹牛启摄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幽钢,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼歉备,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了匪燕?” 一聲冷哼從身側(cè)響起蕾羊,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帽驯,沒想到半個(gè)月后龟再,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尼变,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年利凑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫌术。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哀澈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛉威,到底是詐尸還是另有隱情日丹,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布蚯嫌,位于F島的核電站哲虾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏择示。R本人自食惡果不足惜束凑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栅盲。 院中可真熱鬧汪诉,春花似錦、人聲如沸谈秫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拟烫。三九已至该编,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間硕淑,已是汗流浹背课竣。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留置媳,地道東北人于樟。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拇囊,于是被迫代替她去往敵國(guó)和親迂曲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容