二叉树的定义:
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
思路:
1.遍历两个二叉树,分别判断其的根节点,左右孩子的值是否相等
2.若根节点值相等,但其左右孩子值不相等,我们需要条跳到根节点上重新进行判断
//递归来说思路比较清晰,我们用递归来解决这个问题
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 = HasSubtree(pRoot1->m_pLeft, pRoot2);
}
if (!result)
{
result = HasSubtree(pRoot1->m_pRight, pRoot2);
}
}
return result;
}
//判断树1是否有树2
//递归函数肯定要有出口
bool DoesTree1HaveTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)
{
if (pRoot1 == NULL)
{
return false;
}
if (pRoot2 == NULL)
{
return true;
}
if (pRoot1->m_nValue != pRoot2->m_nValue)
{
return false;
}
return DoesTree1HaveTree2(pRoot1->m_pLeft, pRoot2->m_pLeft) && DoesTree1HaveTree2(pRoot1-> m_pRight, pRoot2->m_pRight);//判断左右子树是否相等
}