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     
原文地址:https://www.cnblogs.com/yunxintryyoubest/p/13416302.html