题目:输入两棵二叉树A和B,判断B是不是A的子结构。
分析:要查找数A中是否存在数B结构一样的二叉树,分为两步,第一步是在数A中查找和B的根结点的值一样的结点R,第二步再判断树A中以R为根结点的子树是不是包含和树B一样的结构。
测试用例:
功能测试(树A和树B都是普通的二叉树,树B是或者不是树A的子结构)
特殊输入测试(两棵二叉树中的一个或者两个根结点为NULL指针、二叉树的所有结点都没有左子树或者右子树)
代码如下:
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
}
bool DoesTree1HaveTree2(BinaryTreeNode* pRoot1,BinaryTreeNode* pRoot2)
{
if(pRoot1==NULL)
return True;
if(pRoot2==NULL)
return false;
if(pRoot1->m_nValue!=pRoot2->m_nValue)
return false;
return DoesTree1HaveTree2(pRoot1->m_pLeft,pRoot2->m_pLeft)
&& DoesTree1HaveTree2(pRoot1->m_pRight,pRoot2->m_pRight);
}
bool HasSubTree(BinaryTreeNode* pRoot1,BinaryTreeNode* pRoot2)
{
bool result=false;
if(pRoot1!=NULL && pRoot2!=NULL)
{
if(pRoot1->m_nValue==pRoot2->m_nValue)
result=DoesTree1HaveTree2(pRoot1, pRoot2);
if(!result)
result=DoesTree1HaveTree2(pRoot1->m_pLeft, pRoot2);
if(!result)
result=DoesTree1HaveTree2(pRoot1->m_pRight, pRoot2);
}
return result;
}