572. 另一個樹的子樹(Python)

題目

難度:★☆☆☆☆
類型:二叉樹

給定兩個非空二叉樹 s 和 t,檢驗 s 中是否包含和 t 具有相同結(jié)構(gòu)和節(jié)點值的子樹。s 的一個子樹包括 s 的一個節(jié)點和這個節(jié)點的所有子孫。s 也可以看做它自身的一棵子樹。

題目

示例 1:
給定的樹 s:

     3
    / \
   4   5
  / \
 1   2

給定的樹 t:

   4
  / \
 1   2

返回 true,因為 t 與 s 的一個子樹擁有相同的結(jié)構(gòu)和節(jié)點值。

示例 2:
給定的樹 s:

     3
    / \
   4   5
  / \
 1   2
    /
   0

給定的樹 t:

   4
  / \
 1   2

返回 false。

解答

這是樹的一個基礎(chǔ)題,判斷一棵樹是否是另一棵的子樹,通過前序遍歷的結(jié)果是否存在包含關(guān)系實現(xiàn)。

class Solution:
    def isSubtree(self, s, t):
        def pre_order(root, res):
            """
            獲得二叉樹的前序遍歷結(jié)果
            :param root:  二叉樹根節(jié)點
            :param res: 結(jié)果存儲列表
            :return:
            """
            if root:                            # 如果當(dāng)前節(jié)點不為空
                res.append(str(root.val))       # 添加當(dāng)前結(jié)點的值
                pre_order(root.left, res)       # 左子樹的前序遍歷
                pre_order(root.right, res)      # 右子樹的前序遍歷
            else:                               # 如果當(dāng)前結(jié)點為空
                res.append('#')                 # 用“#”代替

        s_list, t_list = [], []                 # 序列化結(jié)果存儲器
        pre_order(s, s_list)                    # 獲取s的前序遍歷結(jié)果
        pre_order(t, t_list)                    # 獲取t的前序遍歷結(jié)果
        # print(','.join(t_list))
        # print(','.join(s_list))
        # 將列表轉(zhuǎn)為字符串進(jìn)行比較,前端加“,”防止出現(xiàn)“2,#,#”in“12,#,#”中的情況
        return ','+','.join(t_list) in ','+','.join(s_list)

同樣,我們可以考慮使用元組精簡上述復(fù)雜的前序遍歷流程:

class Solution:
    def isSubtree(self, s, t):
        # 這個函數(shù)把樹序列化為一個元組
        toTup = lambda n: (n.val, toTup(n.left), toTup(n.right)) if n else None
        # 把元組轉(zhuǎn)化為字符串以方便比較
        return str(toTup(t)) in str(toTup(s))

如有疑問或建議,歡迎評論區(qū)留言~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結(jié)點至多有m個孩子。 除根結(jié)點和葉子結(jié)點外,其它每個結(jié)點至少有m...
    文檔隨手記閱讀 13,698評論 0 25
  • 樹的定義與基本術(shù)語 ??樹型結(jié)構(gòu)是一類重要的非線性數(shù)據(jù)結(jié)構(gòu),其中以樹和二叉樹最為常用,是以分支關(guān)系定義的層次結(jié)構(gòu)。...
    java技術(shù)分享師閱讀 1,222評論 0 1
  • 2019 iOS面試題大全---全方面剖析面試2018 iOS面試題---算法相關(guān)1、七種常見的數(shù)組排序算法整理(...
    Theendisthebegi閱讀 10,618評論 0 17
  • 有的時候前輩能給你關(guān)于未來的忠告,因為那是他們曾經(jīng)經(jīng)歷過的過去。 有的時候自己能給自己關(guān)于方向的指引,因為那是最初...
    O布布O閱讀 209評論 0 1
  • 簡介:想要做一個前后端分離的管理系統(tǒng)(Vue+tp5),網(wǎng)上找了很多有關(guān)VueThink是一套基于Vue全家桶(V...
    果Z閱讀 223評論 0 0

友情鏈接更多精彩內(nèi)容