子树的包含问题

判断一棵树是否是另一棵树的子树,操作方法主要分成两部分,

第一部分是确定子树的根节点在待检测树中的位置,检测方法很是简单,使用先序遍历整棵树,如果遍历中节点的值等于子树的根节点的值即可

第二部分,是在第一部分的基础上,已经有了两个根节点,所以我们可以使用递归的方法,进行判断,直到带判断的两个节点中有一个是NULL即可

struct BinTree
{
	int val;
	BinTree* left;
	BinTree* right;
	BinTree():val(0),left(NULL),right(NULL){};
};
BinTree* CreateBinTree()
{
	BinTree* head=NULL,*cur=NULL;
	int a=0;
	while(cin>>a&&a!=-1)
	{
		if(NULL==head)
		{
			head=cur=new BinTree();
			head->val=a;
			continue;
		}
		while(NULL!=cur)
		{
			if(cur->val<a)
			{
				//应该位于cur的右子树上
				if(NULL==cur->right)
				{
					cur->right=new BinTree();
					cur->right->val=a;
					cur=head;
					break;
				}
				else
				{
					cur=cur->right;
				}
			}
			else
			{
				//应该位于左子树上
				if(NULL==cur->left)
				{
					cur->left=new BinTree();
					cur->left->val=a;
					cur=head;
					break;
				}
				else
				{
					cur=cur->left;
				}

			}
		}
	}
	return head;
}
bool hasTree(BinTree* const root_1,BinTree* root_2)
{	
	bool result=false;
	if(NULL==root_2)
		return true;
	if(NULL==root_1)
	{
		return false;
	}
	if(root_1->val==root_2->val)
	{
		result=(hasTree(root_1->left,root_2->left))&&(hasTree(root_1->right,root_2->right));
	}
	return result;
	
}
bool PosRoot(BinTree* const proot,BinTree* const subTree)
{
	if(NULL==proot)
	{
		return false;
	}
	if(NULL==subTree)
	{
		return true;
	}
	bool result=false;
	if(proot->val==subTree->val)
	{
		result=hasTree(proot,subTree);
	}
	if(!result)
	{
		if(NULL!=proot->left)
			result=hasTree(proot->left,subTree);		
	}
	if(!result)
	{
		if(NULL!=proot->right)
			result=hasTree(proot->right,subTree);		
	}
	return result;
}
int main()
{
	cout<<"请输入第一棵树,以-1结尾\n";
	BinTree* head=CreateBinTree();
	cout<<"请输入第二棵树,以-1结尾\n";
	BinTree* head1=CreateBinTree();
	if(PosRoot(head,head1))
	{
		cout<<"子树关系成立\n";
		return 0;
	}
	cout<<"子树关系不成立\n";
	return 0;
}

这样就完成了子树的判断,主要注意的其实就一点,我们要首先理清思路!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值