由于结点数据可能重复 ,如下图
树s 树t
3 4
/ \ / \
4 5 1 2
/ \
1 2
或树s 树t
1 1
/ \
1 1
先判断两棵树的根结点是否为空,如果均为空,则为真;如果t为空,s不为空,则t所在树是s所在树的子树;如果t不为空,s为空,则为假。 在两棵树的根结点都不为空的情况下,先判断两棵树的根结点数据是否相同,如果相同,则判断是否是相同的树,如果是,则为真;否则,去s的左子树重复上述过程,如果结果仍为假,去s的右子树重复上述过程。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isSameTree(struct TreeNode* p ,struct TreeNode* q)
{
if(p == NULL && q == NULL)
{
return true;
}
if(p == NULL || q == NULL)
{
return false;
}
if(p->val != q->val)
{
return false;
}
return (isSameTree(p->left,q->left) && isSameTree(p->right,q->right));
}
bool isSubtree(struct TreeNode* s, struct TreeNode* t) {
if(s == NULL && t == NULL) //如果两棵树均为空,结果为真
{
return true;
}
if(s == NULL && t != NULL)
{
return false;
}
if(s != NULL && t == NULL)
{
return true;
}
bool result = false;
if(s->val == t->val)
{
result = isSameTree(s,t);
}
if(result == false)
{
result = isSubtree(s->left,t);
}
if(result == false)
{
result = isSubtree(s->right,t);
}
return result;
}