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,和哈希樹等解法,水平有限,能看懂那個意思,還無法用自己的話講出來。