版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/majichen95/article/details/82585076
有两个不同大小的二叉树: 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:
将两树都序列化为字符串,然后看t2字符串是否为t1的字串即可,但这样通过率50%,时间复杂度过高。
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param T1: The roots of binary tree T1.
* @param T2: The roots of binary tree T2.
* @return: True if T2 is a subtree of T1, or false.
*/
public boolean isSubtree(TreeNode T1, TreeNode T2) {
// write your code here
String t1Str = serialByPre(T1);
String t2Str = serialByPre(T2);
int flag = t1Str.indexOf(t2Str);
if(flag == -1)
return false;
else
return true;
}
public String serialByPre(TreeNode root){
if(root == null)
return "#,";
String res = root.val+",";
res += serialByPre(root.left);
res += serialByPre(root.right);
return res;
}
}
解题思路2:
从题目中的第二个例子中可以看出,子树必须是从叶结点开始的,中间某个部分的不能算是子树,那么我们转换一下思路,是不是从T1的某个结点开始,跟T2的所有结构都一样,那么问题就转换成了判断两棵树是否相同,也就是Lintcode 469. Same Tree的问题了,这点想通了其实代码就很好写了,用递归来写十分的简洁,我们先从T1的根结点开始,跟T2比较,如果两棵树完全相同,那么返回true,否则就分别对s的左子结点和右子结点调用递归再次来判断是否相同,只要有一个返回true了,就表示可以找得到。
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param T1: The roots of binary tree T1.
* @param T2: The roots of binary tree T2.
* @return: True if T2 is a subtree of T1, or false.
*/
public boolean isSubtree(TreeNode T1, TreeNode T2) {
// write your code here
if(T2 == null)
return true;
if(T1 == null)
return false;
if(isSame(T1,T2) == true)
return true;
else
return isSubtree(T1.left,T2) || isSubtree(T1.right,T2);
}
//判断T1与T2两棵树是否完全相等
public boolean isSame(TreeNode T1 , TreeNode T2){
if(T1==null && T2==null)
return true;
else if(T1==null || T2==null)
return false;
else if(T1.val != T2.val)
return false;
else
return isSame(T1.left,T2.left) && isSame(T1.right,T2.right);
}
}