题目:
题解:
- 两层递归,第一层递归,来确定t与s相等,还是t是s的左子树或s的右子树。第二层递归,判断这两棵树是否相等。
- 一棵树是另一颗树的子树:要么这两棵树相等;要么这棵树是另一棵树的左子树;要么这棵树是另一颗树的右子树。
代码如下:
class Solution {
public:
//一棵树是另一颗树的子树:要么这两棵树相等;要么这棵树是另一棵树的左子树;要么这棵树是另一颗树的右子树
bool isSubtree(TreeNode* s, TreeNode* t) {
if(!s&&!t)return true;//t、s都为空,这两棵树相等
if(!s&&t)return false;//s为空,t不为空,t不为s的子树,返回false
if(isSameTree(s,t))return true;//判断两棵树是否相等
return isSubtree(s->left,t)||isSubtree(s->right,t);//判断t是否为s的左子树或右子树
}
bool isSameTree(TreeNode* s,TreeNode* t){
if(!s&&!t)return true;//s、t都为空,返回true
if(!s||!t)return false;//s、t有一个为空,返回false
if(s->val!=t->val)return false;
//递归s、t左右子树是否相等
return isSameTree(s->left,t->left)&&isSameTree(s->right,t->right);
}
};