二叉樹 12 (兩數(shù)之和IV - 輸入二叉搜索樹 leetcode 653)

思想

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

  1. 遍歷一遍二叉樹尋找答案真友;
  2. 通過分治分解問題尋求答案叔锐;

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

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

多叉樹只有前后序列遍歷,因為只有二叉樹有唯一一次中間節(jié)點(diǎn)的遍歷

題目的關(guān)鍵就是找到遍歷過程中的位置步责,插入對應(yīng)代碼邏輯實現(xiàn)場景的目的返顺。

實例

兩數(shù)之和IV - 輸入二叉搜索樹 leetcode 653

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

輸入:
(1)root: TreeNode,二叉樹的根節(jié)點(diǎn)蔓肯;
(2)k: int遂鹊,目標(biāo)兩數(shù)和;

輸出:
bool省核,返回樹中是否存在兩個元素之和為目標(biāo)值稿辙。

舉例:
給定二叉樹 [5,3,6,2,4,null,7], k = 9
5 + 4 = 9昆码,存在兩個元素和是 9气忠,返回 True

    5                 
   / \               
 3    6         
/ \  / \           
2 4     7      

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

分治解

基本情境是獲得一個當(dāng)前節(jié)點(diǎn)和左右子樹脓匿,用一塊內(nèi)存記錄需要的元素淘钟,如果當(dāng)前節(jié)點(diǎn)值在需要的元素中,返回 True陪毡,否則繼續(xù)遍歷左右子樹米母,全部遍歷完不存在則返回 False勾扭。
base 條件是如果當(dāng)前節(jié)點(diǎn)為 None 則直接返回。

上例中铁瞒,目標(biāo)元素初始為 {}

  • 從 5 開始遍歷妙色,需要 9-5 = 4,目標(biāo)元素更新為 {4}
  • 左子樹 3慧耍,需要 9-3 = 6身辨,目標(biāo)元素更新為 {4,6}
  • 左子樹 2,需要 9-2 = 7芍碧,目標(biāo)元素更新為 {4,6,7}
  • 左子樹 None煌珊,返回
  • 右子樹 4,屬于目標(biāo)元素泌豆,返回 True

編碼


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 two_sum_iv_input_is_a_bst(root: Optional[TreeNode], k: int) -> bool:
    # 目標(biāo)元素集
    target = set()
    def traverse(root: TreeNode) -> bool:
        # 初始條件定庵,空節(jié)點(diǎn)不處理
        if root is None:
            return
        # 前序遍歷位置,比對當(dāng)前節(jié)點(diǎn)值并處理
        nonlocal target
        if root.val in target:
            # 當(dāng)前節(jié)點(diǎn)值在目標(biāo)元素集中踪危,返回存在
            return True
        else:
            # 當(dāng)前節(jié)點(diǎn)值不在目標(biāo)元素集中洗贰,將新的目標(biāo)加入
            target.add(k - root.val)
        # 左右子樹分別遍歷,都不存在則返回 False
        return traverse(root.left) or traverse(root.right) or False
    return traverse(root)

相關(guān)

二叉樹 0
二叉樹 1
二叉樹 2
二叉樹 3
二叉樹 4
二叉樹 5
二叉樹 6
二叉樹 7
二叉樹 8
二叉樹 9
二叉樹 10
二叉樹 11

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陨倡,一起剝皮案震驚了整個濱河市敛滋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兴革,老刑警劉巖绎晃,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杂曲,居然都是意外死亡庶艾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門擎勘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咱揍,“玉大人,你說我怎么就攤上這事棚饵∶喝梗” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵噪漾,是天一觀的道長硼砰。 經(jīng)常有香客問我,道長欣硼,這世上最難降的妖魔是什么题翰? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上豹障,老公的妹妹穿的比我還像新娘冯事。我一直安慰自己,他們只是感情好血公,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布桅咆。 她就那樣靜靜地躺著,像睡著了一般坞笙。 火紅的嫁衣襯著肌膚如雪岩饼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天薛夜,我揣著相機(jī)與錄音籍茧,去河邊找鬼。 笑死梯澜,一個胖子當(dāng)著我的面吹牛寞冯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晚伙,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼吮龄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咆疗?” 一聲冷哼從身側(cè)響起漓帚,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎午磁,沒想到半個月后尝抖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡迅皇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年昧辽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片登颓。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡搅荞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出框咙,到底是詐尸還是另有隱情咕痛,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布扁耐,位于F島的核電站暇检,受9級特大地震影響产阱,放射性物質(zhì)發(fā)生泄漏婉称。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望王暗。 院中可真熱鬧悔据,春花似錦、人聲如沸俗壹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绷雏。三九已至头滔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涎显,已是汗流浹背坤检。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留期吓,地道東北人早歇。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像讨勤,于是被迫代替她去往敵國和親箭跳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

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