Day 25 二叉樹 拓展:100. 相同的樹恭理,572. 另一棵樹的子樹

100. 相同的樹

  • 思路
    • example
    • 遞歸,前/后序
  • 復雜度. 時間:O(n), 空間: O(n)
class Solution:
    def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
        def traversal(root1, root2):
            if root1 == None and root2 == None:
                return True 
            if root1 == None and root2 != None:
                return False 
            if root1 != None and root2 == None:
                return False 
            if root1.val != root2.val:
                return False 
            left_result = traversal(root1.left, root2.left)
            right_result = traversal(root1.right, root2.right)
            return left_result and right_result 
        return traversal(p, q) 
  • 優(yōu)化
class Solution:
    def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
        def traversal(root1, root2):
            if root1 == None and root2 == None:
                return True 
            if root1 == None and root2 != None:
                return False 
            if root1 != None and root2 == None:
                return False 
            if root1.val != root2.val:
                return False 
            return traversal(root1.left, root2.left) and traversal(root1.right, root2.right)
        return traversal(p, q)  

572. 另一棵樹的子樹

  • 思路
    • example
    • isSameTree(root1, root2)
    • 注意root為None的情況
  • 復雜度. 時間:O(), 空間: O()
class Solution:
    def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
        def isSameTree(root1, root2):
            if not root1 and not root2:
                return True 
            if (not root1 and root2) or (root1 and not root2):
                return False
            if root1.val != root2.val:
                return False 
            return isSameTree(root1.left, root2.left) and isSameTree(root1.right, root2.right)
        if root == None and subRoot:
            return False
        return isSameTree(root, subRoot) or self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot)
  • 轉(zhuǎn)化為數(shù)組, KMP 匹配
    • 前序遍歷
    • 注意None也要加入數(shù)組比較
  • 復習KMP
    • s = 'abcabcabd'
    • p = 'abcabd' (模式串)
      • next[i]: 模式串最長"公共"前后綴長度, e.g., next[4] = 2, abcabd
        • 前綴: ..., i, 不包括0th位置
        • 后綴:0,1,..., 不包括ith位置
        • next數(shù)組計算
nxt = [0] * len(p)
slow, fast = 0, 1
while fast < len(p):
    if p[slow] == p[fast]:
        nxt[fast] = nxt[fast-1] + 1
        slow += 1
        fast += 1
    elif slow != 0:
        slow = nxt[slow-1]
    else:
        nxt[fast] = 0
        fast += 1
  • KMP main code
i, j = 0, 0
while i < len(s):
    if s[i] == p[j]:
        i += 1
        j += 1
    elif j != 0:
        j = nxt[j-1]
    else:
        i += 1
    if j == len(p):
        Done
  • 子樹 main code
class Solution:
    def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
        def getNext(p):
            nxt = [0] * len(p)
            slow, fast = 0, 1
            while fast < len(p):
                if p[slow] == p[fast]:
                    nxt[fast] = slow + 1
                    slow += 1
                    fast += 1
                elif slow != 0:
                    slow = nxt[slow-1]
                else:
                    nxt[fast] = 0
                    fast += 1
            return nxt 

        def kmp(s, p):
            nxt = getNext(p)
            i, j = 0, 0
            while i < len(s):
                if s[i] == p[j]:
                    i += 1
                    j += 1
                elif j != 0:
                    j = nxt[j-1]
                else:
                    i += 1
                if j == len(p):
                    return True  
            return False

        def getArray(root): # recursive
            def preorder(root):
                if root == None:
                    path.append('*')
                    return 
                path.append(root.val)
                preorder(root.left)
                preorder(root.right)
            path = []
            preorder(root) 
            return path

        def getArray2(root): # iterative
            cur, stack = root, []
            res = []
            while cur or stack:
                if cur:
                    stack.append(cur)
                    res.append(str(cur.val))
                    cur = cur.left
                else:
                    res.append('*')
                    node = stack.pop()
                    cur = node.right 
            res.append('*') # !!!
            return res

        nums1 = getArray(root)
        nums2 = getArray(subRoot)
        return kmp(nums1, nums2)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市荠医,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖彬向,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兼贡,死亡現(xiàn)場離奇詭異,居然都是意外死亡娃胆,警方通過查閱死者的電腦和手機遍希,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來里烦,“玉大人凿蒜,你說我怎么就攤上這事⌒埠冢” “怎么了废封?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長丧蘸。 經(jīng)常有香客問我漂洋,道長,這世上最難降的妖魔是什么力喷? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任刽漂,我火速辦了婚禮,結(jié)果婚禮上弟孟,老公的妹妹穿的比我還像新娘贝咙。我一直安慰自己,他們只是感情好披蕉,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布颈畸。 她就那樣靜靜地躺著,像睡著了一般没讲。 火紅的嫁衣襯著肌膚如雪眯娱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天爬凑,我揣著相機與錄音徙缴,去河邊找鬼。 笑死嘁信,一個胖子當著我的面吹牛于样,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播潘靖,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼穿剖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了卦溢?” 一聲冷哼從身側(cè)響起糊余,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤秀又,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贬芥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吐辙,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年蘸劈,在試婚紗的時候發(fā)現(xiàn)自己被綠了昏苏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡威沫,死狀恐怖贤惯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情壹甥,我是刑警寧澤救巷,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站句柠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏棒假。R本人自食惡果不足惜溯职,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帽哑。 院中可真熱鬧谜酒,春花似錦、人聲如沸妻枕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屡谐。三九已至述么,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愕掏,已是汗流浹背度秘。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饵撑,地道東北人剑梳。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像滑潘,于是被迫代替她去往敵國和親垢乙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

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