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

剑指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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值