第一次做二叉树的题目。首先要知道,二叉树的题目,大部分都可以用递归来解决。
对于这道题,我们先考虑一个子问题,怎么样判断两棵树是不是相同的树。我们可以先比较两个树根,这里分几种情况:
1.两个树根都是空,则树相同。
2.两个树根只有一个为空,则肯定不相同。
3.两个树根都不为空,这里分两种情况:树根处的值相等,那我们需要继续比较他们的儿子是否相等;如果值不相等,则树不相等。
如果要继续比较的话,我们需要他们的左儿子和右儿子都相等,这其实是一个"&&"的关系。递归版代码如下:
bool isSame(TreeNode* s, TreeNode* t)
{
if(s == NULL && t == NULL)return true;
if(s == NULL || t == NULL)return false;
if(s->val != t->val)return false;
return isSame(s->left, t->left) && isSame(s->right, t->right);
}
解决了这个子问题,我们剩下要做的,就是遍历s这个树,找跟t的树根的值一样的顶点,然后判断它们是不是一样就可以。遍历一个顶点时,如果是t的树根的值一样,判断一下,如果一样,返回true就可以;如果不是,因为我们还要继续找,不能返回false。如果这个顶点跟t的根不一样,怎么办?其实这里是“||”的关系,这个顶点不一样没关系,它的左子树或右子树有一个一样就可以了。代码如下:
bool isSubtree(TreeNode* s, TreeNode* t) {
if(s == NULL || t == NULL)return false;
if(s->val == t->val)
if(isSame(s, t))return true;
return isSubtree(s->left, t) || isSubtree(s->right, t);
}