题目
输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)
解析
树的思想就是递归,因为每一个结点可以看作是独立的结点或是其父节点的左右孩子。是否是子树的判断实际上就是判断两树是否相等,若不想等,则判断其中一方子树与树是否相等。
代码
int IsEqual(struct TreeNode* Root1, struct TreeNode* Root2)
{
if (Root2 == NULL)
return 1;
if (Root1 == NULL)
return 0;
if (Root1->val != Root2->val) //若根节点不同,则树必定不同
return 0;
else
return(IsEqual(Root1->left, Root2->left) && IsEqual(Root1->right, Root2->right)); //若根节点相同,则递归,对根节点以下的结点同样使用的方式判断是否相等
}
bool HasSubtree(struct TreeNode* pRoot1, struct TreeNode* pRoot2 ) {
int result = 0;
if (pRoot1 && pRoot2) //若根1,2均存在
{
if (pRoot1->val == pRoot2->val) //若根节点1,2相同,则判断1,2树是否相同
result = IsEqual(pRoot1, pRoot2);
if (!result)
result = HasSubtree(pRoot1->left, pRoot2); //若不同,则比较1的左子树和2
if(!result)
result = HasSubtree(pRoot1->right, pRoot2); //或比较1的右子树和2
}
return result;
}