树的子结构

题目:输入两颗二叉树A和B 判断B是不是A的子结构 二叉树结点定义如下;

首先 从树根开始遍历树


如果结点与 B的根结点值相同 则继续遍历A的左子树 以及B的左子树 如果左子树相同则遍历A的右子树以及B的左子树 如果左右子树都相同则 A包含B

如果结点与B的根节点值不同 则遍历到A的左孩子 重复上述判断做孩子是否含有B 如果左子树不含有B 则遍历到A的右子树 判断其是否含有B


因此 首先遍历A 即树的中序遍历 如果结点与B的根节点值相同 则递归遍历A中当前节点与B 各自结点是否相同 

递归截止条件是达到了A或B的叶节点 




struct BinaryTreeNode{
	int m_nValue;
	BinaryTreeNode *m_pLeft;
	BinaryTreeNode *m_pRight;
};
bool  hastree(BinaryTreeNode *A,BinaryTreeNode *B)
{
	bool r=false;
	if(A!=NULL && B!=NULL)
	{
	if(A->m_nValue==B->m_nValue)
		r= haschild(A,B);
	if(r==false)
		r=hastree(A->m_pLeft,B);
	if(r==false)	
		r=hastree(A->m_pRight,B);
	}
	return r;
}
bool haschild(BinaryTreeNode *A,BinaryTreeNode *B)
{

	if(B->m_nValue !=A->m_nValue)
		return false;	//
	
	if(B==NULL)
			return true;
<span style="font-family: Arial, Helvetica, sans-serif;">                 if(A==NULL)</span>

		return false;

		return haschild(A->m_pLeft,B->m_pLeft) && haschild(A->m_pRight,B->m_pRight);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值