目录
一、题目
二、思路
1.先判断两棵树是不是两颗相同的树
2.如果不是,那么分别判断subRoot是不是root的左子树或者右子树(换句话来说,就是,subRoot和root的左子树或右子树是不是同一颗树)
时间复杂度:O(∣s∣×∣t∣)
空间复杂度:O(max{d1,d2})。假设s的深度为d1,t的深度为d2,任意时刻栈空间的最大使用代价是 O(max{d1,d2})
三、代码实现
class Solution {
private boolean isSameTree(TreeNode p, TreeNode q) {
if(p == null && q == null){
return true;
}
if(p != null && q == null || p == null && q != null){
return false;
}
if(p.val != q.val){
return false;
}
return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
}
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
if(root == null || subRoot == null){
return false;//如果其中一个为空,则返回false;虽然说isSameTree这个函数里面也判断了,但是此处的判断是为了服务isSubtree的
}
if(isSameTree(root, subRoot)){
return true;
}
if(isSubtree(root.left,subRoot)){
return true;
}
if(isSubtree(root.right,subRoot)){
return true;
}
return false;
}
}