leetcode572. 另一個樹的子樹

leetcode572. 題目描述
  給定兩個非空二叉樹 s 和 t,檢驗 s 中是否包含和 t 具有相同結構和節點值的子樹。s 的一個子樹包括 s 的一個節點和這個節點的所有子孫。s 也可以看做它自身的一棵子樹。

解題思路:
  這個題雖然是簡單題,但是他的別的解法可沒那麼簡單呀,這裏提供的解法是暴力解法,先實現兩個二叉樹是否相等isequal的函數,這個應該比較簡答,只需在dfs遍歷的時候判斷兩個節點是否相同即可,下面給出代碼。
  然後我們dfs遍歷s二叉樹每個節點,如果某個節點值和t的頭結點值相同,我們調用isequal,判斷兩個二叉樹是否相同,如果相同返回True,如果不相同繼續遍歷。代碼如下:

class Solution:
    def isSubtree(self, s: TreeNode, t: TreeNode) -> bool:
    	#如果s非空,t爲空,返回false
        if not s and t:
            return False
        #如果s和t都爲空,返回True
        if not s and not t:
            return True
        #剩下說明s和t不爲空,如果他們值相同,調用isequal判斷當前子樹和t相同,如果相同就返回True,不相同繼續dfs遍歷
        if s.val==t.val:
            res = self.isequal(s,t)
            return res or self.isSubtree(s.left,t) or self.isSubtree(s.right,t)

        return self.isSubtree(s.left,t) or self.isSubtree(s.right,t)

    


    def isequal(self, root1,root2):
    	#兩個都爲空說明,遍歷結束,返回True
        if not root1 and not root2:
            return True
        #兩個都不爲空,需要判斷兩者的val,如果相同繼續遍歷,不相同直接返回False
        elif root1 and root2:
            if root1.val==root2.val:
                return self.isequal(root1.left,root2.left) and self.isequal(root1.right,root2.right)
            else:
                return False
        else:
            return False

  個人感覺二叉樹真的很鍛鍊算法,感覺遞歸和二叉樹是絕配呀,二叉樹寫多了,遞歸手到擒來,還是得多練練二叉樹的題!至於許多大佬給出的就和KMP,和哈希樹等解法,水平有限,能看懂那個意思,還無法用自己的話講出來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章