您的位置:首页 > 编程语言

编程练习之一颗二叉树包含另一颗二叉树

2015-06-16 21:37 417 查看
剑指offer上的一道编程练习,如何确定二叉树A包含一棵相对小一点的二叉树B?

思路:用两个函数实现,第一个首先判断根结点是否相等,第二个函数继续判断子结构是否相等

函数一:

第一步,首先从根结点入手,判断pRootA的值是否与pRootB的根结点的值是否相等。若相等,则在比较A树的子结构是否包含B数子结构,此时转入函数二;

若不相等
则转入:

第二步,递归进入函数一,判断pRootA的左子树的值是否与pRootB的根结点的值是否相等,若相等则转入函数二;

若还不相等 则转入:

第三步,递归进入函数一,判断pRootA的右子树的值是否与pRootB的根结点的值是否相等,若相等则转入函数二;

函数一代码如下:

bool HasSubTree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)
{
bool result = false;
if (pRoot1 != NULL&&pRoot2 != NULL)
{
if (pRoot1->m_value == pRoot2->m_value)
result = DoseTree1HasTree2(pRoot1, pRoot2);
if (!result)
result = HasSubTree(pRoot1->m_pLeft, pRoot2);//if not,turn to left tree to find;
if (!result)
result = HasSubTree(pRoot1->m_pRight, pRoot2);//if not again,turn to right tree to find;
}
}


最后。递归完成后,若左右子树中的根结点都不相等,说明A树不含有B树。

函数二:

在根结点相等的基础上,递归的判断A树的左右子树的值是否与B数的左右子树的值相等,

若是在pRootB全部遍历结束时,则说明A树含有B树,

若是在pRootA全部遍历结束时,则说明A树不含有B树。

函数二代码如下:

bool DoseTree1HasTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)
{
if (pRoot2 == NULL)		//if all of Tree2 has been traced,so that we find Tree1 has had Tree2
return true;
if (pRoot1 == NULL)
return false;					//if all of Tree1 has been traced,so that we find Tree1 has not had Tree2

return DoseTree1HasTree2(pRoot1->m_pLeft, pRoot2->m_pLeft) &&
DoseTree1HasTree2(pRoot1->m_pRight, pRoot2->m_pRight);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: