原来以为只要一个函数就够了,发现思路错了。
写出下列傻逼错误函数。
出错情况是
SUbhasSubTree不可以不作为整体判断的情况。
bool match;
bool HasSubtree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)
{
match=false;
return SubHasSubtree(pRoot1,pRoot2);
}
bool SubHasSubtree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)
{
if(match == true) return true;
if(pRoot1==NULL ^ pRoot2==NULL)return false;
else if(pRoot1==NULL && pRoot2==NULL) return true;
else if(pRoot1->m_nValue!=pRoot2->m_nValue)
{
return SubHasSubtree(pRoot1->m_nLeft,pRoot2) ||
SubHasSubtree(pRoot1->m_nRight,pRoot2);
}
else
{
return SubHasSubtree(pRoot1->m_nLeft,pRoot2) ||
SubHasSubtree(pRoot1->m_nRight,pRoot2)||
(SubHasSubtree(pRoot1->m_nLeft,pRoot2->m_nLeft) && SubHasSubtree(pRoot1->m_nRight,pRoot2->m_nRight));
}
}
原来简单程序也会有出错情况,因为我的自以为是。
参考给出的源代码恍然大悟啊。
bool Tree1HasTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2);
bool HasSubtree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)
{
bool r=false;
if(pRoot1!=NULL && pRoot2!=NULL)
{
r=Tree1HasTree2(pRoot1,pRoot2);
if(!r) r=HasSubtree(pRoot1->m_pLeft,pRoot2);
if(!r) r=HasSubtree(pRoot1->m_pRight,pRoot2);
}
return r;
}
bool Tree1HasTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)
{
if(pRoot2==NULL)return true;
else if(pRoot1==NULL)return false;
else if(pRoot1->m_nValue!=pRoot2->m_nValue) return false;
return Tree1HasTree2(pRoot1->m_pLeft,pRoot2->m_pLeft) &&
Tree1HasTree2(pRoot1->m_pRight,pRoot2->m_pRight);
}