剑指offer 面试题18-树的子结构

原来以为只要一个函数就够了,发现思路错了。

写出下列傻逼错误函数。

出错情况是

SUbhasSubTree不可以不作为整体判断的情况。


bool match;
bool HasSubtree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)
{
	match=false;
	return SubHasSubtree(pRoot1,pRoot2);
}
bool SubHasSubtree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)
{
	if(match == true) return true;
	if(pRoot1==NULL ^ pRoot2==NULL)return false;
	else if(pRoot1==NULL && pRoot2==NULL) return true;
	else if(pRoot1->m_nValue!=pRoot2->m_nValue)
	{
		return SubHasSubtree(pRoot1->m_nLeft,pRoot2) ||
			SubHasSubtree(pRoot1->m_nRight,pRoot2);
	}
	else
	{
		return SubHasSubtree(pRoot1->m_nLeft,pRoot2) ||
			SubHasSubtree(pRoot1->m_nRight,pRoot2)||
			(SubHasSubtree(pRoot1->m_nLeft,pRoot2->m_nLeft) && SubHasSubtree(pRoot1->m_nRight,pRoot2->m_nRight));
	}
}

原来简单程序也会有出错情况,因为我的自以为是。

参考给出的源代码恍然大悟啊。


bool Tree1HasTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2);

bool HasSubtree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)
{
	bool r=false;
	if(pRoot1!=NULL && pRoot2!=NULL)
	{
		r=Tree1HasTree2(pRoot1,pRoot2);
		if(!r) r=HasSubtree(pRoot1->m_pLeft,pRoot2);
		if(!r) r=HasSubtree(pRoot1->m_pRight,pRoot2);
	}
	return r;
}
bool Tree1HasTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)
{
	if(pRoot2==NULL)return true;
	else if(pRoot1==NULL)return false;
	else if(pRoot1->m_nValue!=pRoot2->m_nValue) return false;
	return Tree1HasTree2(pRoot1->m_pLeft,pRoot2->m_pLeft) &&
		Tree1HasTree2(pRoot1->m_pRight,pRoot2->m_pRight);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值