Leetcode【700澜共、872向叉、897、965嗦董、1022】

問(wèn)題描述:【Tree】700. Search in a Binary Search Tree
解題思路:

這道題是給一棵二叉搜索樹(BST)母谎,查找給定的結(jié)點(diǎn)。結(jié)點(diǎn)不存在返回 NULL京革。

利用 BST 的特點(diǎn)销睁,進(jìn)行二分查找即可。

Python3 實(shí)現(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 searchBST(self, root: TreeNode, val: int) -> TreeNode:
        if not root:
            return None
        if root.val == val:
            return root
        elif root.val > val:
            return self.searchBST(root.left, val)
        elif root.val < val:
            return self.searchBST(root.right, val)

問(wèn)題描述:【Tree】872. Leaf-Similar Trees
解題思路:

這道題是給兩棵樹存崖,判斷它們的葉子序列(從左到右)是否相同冻记。

將兩棵樹的葉子序列保存在 list 中,判斷二者是否相同即可来惧。

1冗栗、判斷葉子的條件是 root.left == None and root.right == None,返回 [root.val];
2隅居、還要注意單子樹的情況([1, 2] 或 [1, null, 2])钠至,應(yīng)該返回 [];

Python3 實(shí)現(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 leafSimilar(self, root1: TreeNode, root2: TreeNode) -> bool:
        def leafSeq(root):  # 得到樹的葉子序列
            if not root:  # 防止單子樹(如 [1,2] 或者 [1,null,2])
                return []
            if root.left == None and root.right == None:  # 葉子
                return [root.val]
            return leafSeq(root.left) + leafSeq(root.right)
        
        return leafSeq(root1) == leafSeq(root2)

問(wèn)題描述:【Tree】897. Increasing Order Search Tree
解題思路:

這道題是給一棵二叉搜索樹胎源,將結(jié)點(diǎn)按照從小到大重新排列棉钧,構(gòu)造一棵只有右結(jié)點(diǎn)的樹。

先前序遍歷將每個(gè)結(jié)點(diǎn)保存在 list 中涕蚤,再構(gòu)造只有右結(jié)點(diǎn)的樹宪卿。構(gòu)造右結(jié)點(diǎn)的樹時(shí),除了根結(jié)點(diǎn) node 外万栅,還要有一個(gè)工作指針 cur佑钾,在遍歷 list 的過(guò)程中,cur 每次往右子樹走(cur = cur.right)烦粒,最后返回 node 即可休溶。

Python3 實(shí)現(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 increasingBST(self, root: TreeNode) -> TreeNode:
        
        def in_order(root):  # 中序遍歷,保存結(jié)點(diǎn)
            if not root:
                return []
            return in_order(root.left) + [TreeNode(root.val)] + in_order(root.right)
        
        nodelist = in_order(root)
        node = cur = nodelist[0]  # node:指向根結(jié)點(diǎn)扰她,cur:往右子樹走
        for i in range(1, len(nodelist)):
            cur.right = nodelist[i]
            cur = cur.right
        return node

問(wèn)題描述:【Tree】965. Univalued Binary Tree
解題思路:

這道題是給一棵二叉樹兽掰,判斷其是否是單值二叉樹(所有結(jié)點(diǎn)值都相同)。

1徒役、先將根結(jié)點(diǎn)的值作為目標(biāo)值 tar禾进,將 tar 也參與遞歸函數(shù);
2廉涕、如果 root 為 None泻云,返回 True;
3狐蜕、如果 root.val == tar宠纯,就遞歸左右子樹,返回左右子樹的判斷結(jié)果层释;
4婆瓜、否則返回 False。

Python3 實(shí)現(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 isUnivalTree(self, root: TreeNode) -> bool:
        if not root:
            return True
        self.tar = root.val  # 目標(biāo)值
        return self.judge(root)
    
    def judge(self, root):
        if root == None:
            return True
        if root.val == self.tar:
            return self.judge(root.left) and self.judge(root.right)
        return False

問(wèn)題描述:【DFS贡羔、Tree】1022. Sum of Root To Leaf Binary Numbers
解題思路:

這道題是給一個(gè) 01 二叉樹廉白,計(jì)算從根到葉子所有二進(jìn)制路徑表示的十進(jìn)制數(shù)字的總和。

方法1(回溯法):

第一種容易想到的方法就是 DFS 回溯法乖寒,對(duì)樹進(jìn)行深度優(yōu)先搜索猴蹂,將每條路徑 path 保存在 paths 列表中,每次找到一條路徑的出口是遇到葉子結(jié)點(diǎn)楣嘁。最后磅轻,對(duì) paths 進(jìn)行遍歷珍逸,將每條路徑 path 中的二進(jìn)制轉(zhuǎn)化為十進(jìn)制數(shù)進(jìn)行累加(如 int("0101", 2) = 5)。這樣做的空間復(fù)雜度為 O(n)聋溜。

Python3 實(shí)現(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 sumRootToLeaf(self, root: TreeNode) -> int:
        def findPath(root, path):
            if not root:
                return
            path += str(root.val)  # 往當(dāng)前路徑中添加當(dāng)前結(jié)點(diǎn)
            if root.left == None and root.right == None:  # 到葉子結(jié)點(diǎn)谆膳,增加一條路徑
                paths.append(path)
                return
            findPath(root.left, path)
            findPath(root.right, path)
        
        paths, sum = [], 0  # paths 保存每條路徑
        findPath(root, "")
        for path in paths:
            sum += int(path, 2)   # 二進(jìn)制轉(zhuǎn)十進(jìn)制
        return sum

方法2(不使用額外空間的做法):

有沒(méi)有不使用額外空間的做法呢?當(dāng)然有撮躁。可以使用前綴和 presum漱病。

在深度優(yōu)先搜索的過(guò)程中,每增加一層把曼,就修改當(dāng)前路徑的累加值杨帽,即 presum = presum * 2 + root.val如 1->0->1 (5)再碰到 1 就會(huì)執(zhí)行 presum = presum * 2 + 1 = 11祝迂,剛好是 1->0->1->1(11)睦尽。

具體做法如下:
1器净、如果 root 為空型雳,返回 0;
2山害、更新前綴累加和 presum = presum * 2 + 1纠俭;
2、如果 root.left 或者 root.right 不為空浪慌,就遞歸求解左右子樹路徑和 return pathSum(root.left, presum) + pathSum(root.right, presum)冤荆;
3、最后返回 presum 就是答案权纤;

Python3 實(shí)現(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 sumRootToLeaf(self, root: TreeNode) -> int:
        def pathSum(root, presum):
            if not root:
                return 0
            presum = presum * 2 + root.val  # 每增加一層修改當(dāng)前路徑累加值
            if root.left or root.right:  # 左右子樹路徑之和
                return pathSum(root.left, presum) + pathSum(root.right, presum)
            return presum  # 到葉子結(jié)點(diǎn)
        
        return pathSum(root, 0)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钓简,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子汹想,更是在濱河造成了極大的恐慌外邓,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件古掏,死亡現(xiàn)場(chǎng)離奇詭異损话,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)槽唾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門丧枪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人庞萍,你說(shuō)我怎么就攤上這事拧烦。” “怎么了钝计?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵屎篱,是天一觀的道長(zhǎng)服赎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)交播,這世上最難降的妖魔是什么重虑? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮秦士,結(jié)果婚禮上缺厉,老公的妹妹穿的比我還像新娘。我一直安慰自己隧土,他們只是感情好提针,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著曹傀,像睡著了一般辐脖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上皆愉,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天嗜价,我揣著相機(jī)與錄音,去河邊找鬼幕庐。 笑死久锥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的异剥。 我是一名探鬼主播瑟由,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼冤寿!你這毒婦竟也來(lái)了歹苦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤督怜,失蹤者是張志新(化名)和其女友劉穎殴瘦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亮蛔,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痴施,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了究流。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辣吃。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖芬探,靈堂內(nèi)的尸體忽然破棺而出神得,到底是詐尸還是另有隱情,我是刑警寧澤偷仿,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布哩簿,位于F島的核電站宵蕉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏节榜。R本人自食惡果不足惜羡玛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宗苍。 院中可真熱鬧稼稿,春花似錦、人聲如沸讳窟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)丽啡。三九已至谋右,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間补箍,已是汗流浹背改执。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馏予,地道東北人天梧。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓盔性,卻偏偏與公主長(zhǎng)得像霞丧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冕香,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • 一些概念 數(shù)據(jù)結(jié)構(gòu)就是研究數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)以及它們之間相互關(guān)系蛹尝,并對(duì)這種結(jié)構(gòu)定義相應(yīng)的運(yùn)算,而且確保經(jīng)過(guò)這...
    Winterfell_Z閱讀 5,779評(píng)論 0 13
  • 概念 樹是什么 樹(Tree)是n(n>=0)個(gè)結(jié)點(diǎn)的有限集悉尾。 n = 0的樹是空樹突那。 在任意一棵非空樹中: 有且...
    剛剛悟道閱讀 5,053評(píng)論 1 16
  • 1.樹(Tree): 樹是 n(n>=0) 個(gè)結(jié)點(diǎn)的有限集。當(dāng) n=0 時(shí)稱為空樹构眯。在任意一顆非空樹中:有且僅有一...
    ql2012jz閱讀 1,004評(píng)論 0 3
  • 樹(Tree)是 n >=0 個(gè)結(jié)點(diǎn)的有限集愕难。n=0 時(shí)稱為空樹。在任意一顆非空樹中:有且僅有一個(gè)特定的稱為根(R...
    yuzhiyi_宇閱讀 442評(píng)論 0 0
  • 這個(gè)今天很快做完了惫霸,構(gòu)圖上請(qǐng)教了火貓猫缭,由原先的分散做成了圓形。仔細(xì)畫了圖壹店。文字原先做盡量精簡(jiǎn)猜丹,發(fā)朋友看,說(shuō)不知道表...
    柳成林888閱讀 189評(píng)論 0 0