1. 程式人生 > 實用技巧 >245. 子樹

245. 子樹

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, None
7 """ 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