子树

有两个不同大小的二进制树: T1 有上百万的节点; T2 有好几百的节点。请设计一种算法,判定 T2 是否为 T1的子树。

样例

下面的例子中 T2 是 T1 的子树:

       1                3
      /               / 
T1 = 2   3      T2 =  4
        /
       4

下面的例子中 T2 不是 T1 的子树:

       1               3
      /                
T1 = 2   3       T2 =    4
        /
       4
注意

若 T1 中存在从节点 n 开始的子树与 T2 相同,我们称 T2 是 T1 的子树。也就是说,如果在 T1 节点 n 处将树砍断,砍断的部分将与 T2 完全相同;

解题思路:整体还是二叉树查找的思路,递归是二叉树各类题目中的万能方法;

 1 /**
 2  * Definition of TreeNode:
 3  * public class TreeNode {
 4  *     public int val;
 5  *     public TreeNode left, right;
 6  *     public TreeNode(int val) {
 7  *         this.val = val;
 8  *         this.left = this.right = null;
 9  *     }
10  * }
11  */
12 public class Solution {
13     /**
14      * @param T1, T2: The roots of binary tree.
15      * @return: True if T2 is a subtree of T1, or false.
16      */
17     public boolean isSubtree(TreeNode T1, TreeNode T2) {
18         // write your code here
19         if(T1 == null && T2 == null)   return true;
20         if(T1 == null)  return false;
21         if(T2 == null)  return true;
22         boolean result = exit(T1,T2);
23         if(result)   return true;
24         boolean result2 = isSubtree(T1.left,T2);
25         if(result2)   return true;
26         boolean result3 = isSubtree(T1.right,T2);
27         if(result3)   return true;
28         return false;
29     }
30     boolean exit(TreeNode T3,TreeNode T2){
31         if(T3 == null && T2 == null)   return true;
32         if(T3 == null && T2 != null)  return false;
33         if(T2 == null && T3 != null)  return false;
34         if(T3.val != T2.val)  return false;
35         boolean a = exit(T3.left,T2.left);
36         boolean b = exit(T3.right,T2.right);
37         if(a&&b)  return true;
38         return false;
39     }
40 }
原文地址:https://www.cnblogs.com/wangnanabuaa/p/5008772.html