子树
有两个不同大小的二进制树: 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 }