245. 子樹
阿新 • • 發佈:2020-08-01
245.子樹
中文English有兩個不同大小的二叉樹:T1
有上百萬的節點;T2
有好幾百的節點。請設計一種演算法,判定T2
是否為T1
的子樹。
樣例
樣例 1:
輸入:{1,2,3,#,#,4},{3,4}
輸出:true
解釋:
下面的例子中 T2 是 T1 的子樹:
1 3
/ \ /
T1 = 2 3 T2 = 4
/
4
樣例 2:
輸入:{1,2,3,#,#,4},{3,#,4} 輸出:false 解釋: 下面的例子中 T2 不是 T1 的子樹: 1 3 / \ \ T1 = 2 3 T2 = 4 / 4
注意事項
若 T1 中存在從節點 n 開始的子樹與 T2 相同,我們稱 T2 是 T1 的子樹。也就是說,如果在 T1 節點 n 處將樹砍斷,砍斷的部分將與 T2 完全相同。
輸入測試資料(每行一個引數)如何理解測試資料?佇列 + 子樹分別判斷是否相等(DFS)
1 """ 2 Definition of TreeNode: 3 class TreeNode: 4 def __init__(self, val): 5 self.val = val 6 self.left, self.right = None, None7 """ 8 9 class Solution: 10 """ 11 大致思路: 12 1.迴圈T1節點,只需要給出一個子函式判斷兩個子樹是否相等就可以 13 """ 14 def isSubtree(self, T1, T2): 15 # write your code here 16 if not T1 and T2: return False 17 if T1 and not T2: return True 18 19 #放佇列裡面 20 queue = [T1]21 while queue: 22 cur_root = queue.pop(0) 23 if self.isEqualTree(cur_root, T2): 24 return True 25 26 if cur_root.left: 27 queue.append(cur_root.left) 28 if cur_root.right: 29 queue.append(cur_root.right) 30 31 return False 32 33 34 def isEqualTree(self, root1, root2): 35 if not root1 and not root2: return True 36 #假如dfs的時候任何一個root.left或者root.right沒有了,這說明這兩者是不相等的,子樹不能截斷,要到最底層 37 if not (root1 and root2): return False 38 39 #判斷值是否相等 40 if root1.val != root2.val: return False 41 42 return self.isEqualTree(root1.left, root2.left) and self.isEqualTree(root1.right, root2.right) 43