问题重述
题目:输入两颗二叉树A和B,判断B是不是A的子树,二叉树的节点定义如下
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
思路解析:
在这个问题中,我们要确保子树中的整体结构都能找到,因此先要在树A中找到和树B根节点值一样的节点,然后比较树两颗树的左右树是否相同,如果相同则找到,若不相同,继续在树A中找到和树B根节点值一样的节点,重复操作。
递归是在树的操作中常用的一种方法,但是在递归时一定要把边界条件明确给定。
代码实现:
bool FindSubTree(BinaryTreeNode* rRoot1, BinaryTreeNode* rRoot2)
{
bool result=false;
if (rRoot1 != NULL && rRoot2 != NULL)
{
if (rRoot1->m_nValue == rRoot2->m_nValue)
{
result =HaveSubTree(rRoot1, rRoot2);
}
if (!result)
{
result = FindSubTree(rRoot1->m_pLeft, rRoot2);
}if (!result)
{
result = FindSubTree(rRoot1->m_pRight, rRoot2);
}
}
return result;
}
bool HaveSubTree(BinaryTreeNode* rRoot1, BinaryTreeNode* rRoot2)
{
if (rRoot1 == NULL)
return false;
if (rRoot2 == NULL)
return true;
if (rRoot1->m_nValue != rRoot2->m_nValue)
return false;
return HaveSubTree(rRoot1->m_pLeft, rRoot2->m_pLeft) && HaveSubTree(rRoot1->m_pRight, rRoot2->m_pRight);
}