Leetcode Python超瑣碎筆記: 965. Univalued Binary Tree

超瑣碎 ≈ 完整記錄 + 深入探究 + 任性吐槽

問題地址蟋字,難度:Easy辑奈,標(biāo)簽:Tree

若有錯(cuò)誤之處請予以指正:)

問題描述

A binary tree is univalued if every node in the tree has the same value.

Return true if and only if the given tree is univalued.

Example 1:

Input: [1,1,1,1,1,null,1]
Output: true

Example 2:

Input: [2,2,2,5,2]
Output: false

Note:

  1. The number of nodes in the given tree will be in the range [1, 100].
  2. Each node's value will be an integer in the range [0, 99].

題意分析

這道題需要了解二叉搜索樹的定義啥繁,以及遞歸/循環(huán)的知識月弛。解決的思路:第一種是遞歸的每一步只看一對父子的值是否相等鸥咖,然后傳遞下去符喝,如果每一對都等,肯定全等婿滓;第二種是遞歸只管把所有節(jié)點(diǎn)值取出來老速,最后看一下是不是全等;第三種是先獲取root的值凸主,再遞歸搜索root的子樹看是不是所有節(jié)點(diǎn)都等于這個(gè)值橘券。

實(shí)現(xiàn)方法(及調(diào)優(yōu)過程)

以下前兩種方法對應(yīng)LeetCode上的Solution,第三種是上面沒有的卿吐。

方法1:60 ms

方法1對應(yīng)第一種思路旁舰,看起來挺容易,但做起來有點(diǎn)繞嗡官。

isUnivalTree(root)的結(jié)果即是“root所代表的子樹是否為全等”這個(gè)命題的真值箭窜。首先須確定root到底有沒有左子樹和右子樹,如果沒有衍腥,則真值為True绽快;如果有芥丧,則root的值與左右兩個(gè)子節(jié)點(diǎn)的值必須相等,且兩個(gè)子節(jié)點(diǎn)所代表的子樹也必須是全等的坊罢,兩個(gè)條件同時(shí)滿足時(shí)真值為True

下面貼的代碼是我參考了Solution以后改的擅耽,原來的代碼非常簡潔(幾乎就是邏輯運(yùn)算式)活孩,我只是把邏輯運(yùn)算的順序改得清楚了點(diǎ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):
        """
        :type root: TreeNode
        :rtype: bool
        """
        left = (not root.left) or ((root.val == root.left.val) and self.isUnivalTree(root.left))
        right = (not root.right) or ((root.val == root.right.val) and self.isUnivalTree(root.right))
        return left and right
  • 時(shí)間復(fù)雜度:O(n) (n為樹的節(jié)點(diǎn)數(shù)乖仇,最壞情況下每個(gè)節(jié)點(diǎn)都被遍歷)
  • 空間復(fù)雜度:O(m) (遞歸本身的棧會占用一些資源憾儒,m為樹的深度,影響棧的數(shù)量)
方法2:36 ms

方法2對應(yīng)第二種思路乃沙,個(gè)人感覺不夠優(yōu)雅起趾,因?yàn)楸闅v完樹以后還沒有得到最后的答案(真值)。但實(shí)現(xiàn)起來容易多了警儒。這里我直接貼了LeetCode上的Solution代碼训裆,其組織形式值得理解:values放在isUnivalTree里,isUnivalTree內(nèi)部再寫一個(gè)用于遞歸的函數(shù)getValues蜀铲,這樣values的作用域剛好使得getValues少一個(gè)丑陋的參數(shù)边琉。

# 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):
        """
        :type root: TreeNode
        :rtype: bool
        """
        values = []
        
        def getValues(node):
            if node:
                values.append(node.val)
                getValues(node.left)
                getValues(node.right)
        
        getValues(root)
        return len(set(values)) == 1
  • 時(shí)間復(fù)雜度:O(n) (n為樹的節(jié)點(diǎn)數(shù),最壞情況下每個(gè)節(jié)點(diǎn)都被遍歷)
  • 空間復(fù)雜度:O(m) (遞歸本身的棧會占用一些資源记劝,m為樹的深度变姨,影響棧的數(shù)量)
方法3:70 ms

方法3的實(shí)現(xiàn)從組織方式上參考了方法2,而遞歸輸出了真值則更像方法1厌丑,代碼里比較tricky的地方是如果當(dāng)前節(jié)點(diǎn)為None時(shí)定欧,會返回True(方法1里其實(shí)也有這樣的邏輯)。

# 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):
        """
        :type root: TreeNode
        :rtype: bool
        """
        root_val = root.val
        
        def hasUniValue(node):
            if node:
                return node.val == root_val and hasUniValue(node.left) and hasUniValue(node.right)
            else:
                return True
        
        return hasUniValue(root) 

弄清上面的邏輯后怒竿,還可仿照方法1改寫hasUniValue砍鸠,省略if語句。

        def hasUniValue(node):
                return not node or (node.val == root_val and hasUniValue(node.left) and hasUniValue(node.right))
  • 時(shí)間復(fù)雜度:O(n) (n為樹的節(jié)點(diǎn)數(shù)愧口,最壞情況下每個(gè)節(jié)點(diǎn)都被遍歷)
  • 空間復(fù)雜度:O(m) (遞歸本身的棧會占用一些資源睦番,m為樹的深度,影響棧的數(shù)量)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耍属,一起剝皮案震驚了整個(gè)濱河市托嚣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌厚骗,老刑警劉巖示启,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異领舰,居然都是意外死亡夫嗓,警方通過查閱死者的電腦和手機(jī)迟螺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舍咖,“玉大人矩父,你說我怎么就攤上這事∨琶梗” “怎么了窍株?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長攻柠。 經(jīng)常有香客問我球订,道長,這世上最難降的妖魔是什么瑰钮? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任冒滩,我火速辦了婚禮,結(jié)果婚禮上浪谴,老公的妹妹穿的比我還像新娘开睡。我一直安慰自己,他們只是感情好较店,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布士八。 她就那樣靜靜地躺著,像睡著了一般梁呈。 火紅的嫁衣襯著肌膚如雪婚度。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天官卡,我揣著相機(jī)與錄音蝗茁,去河邊找鬼。 笑死寻咒,一個(gè)胖子當(dāng)著我的面吹牛哮翘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播毛秘,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饭寺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叫挟?” 一聲冷哼從身側(cè)響起艰匙,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抹恳,沒想到半個(gè)月后员凝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奋献,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年健霹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旺上。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡糖埋,死狀恐怖宣吱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阶捆,我是刑警寧澤凌节,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站洒试,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏朴上。R本人自食惡果不足惜垒棋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痪宰。 院中可真熱鬧叼架,春花似錦、人聲如沸衣撬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽具练。三九已至乍构,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扛点,已是汗流浹背哥遮。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留陵究,地道東北人眠饮。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像铜邮,于是被迫代替她去往敵國和親仪召。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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