数据结构(暑假篇7.30)

二叉树的查找操作——递归

Position Find(ElementType X,BinTree BST)
{
	if(!BST)
	return NULL;//空的二叉搜索树
	if(X>BST->Data)
	return Find(X,BST->Right);//在右子树中继续查找 
	else if(X<BST->Data)
	return Find(X,BST->Left);//在左子树中继续查找 
	else //X=BST->Data; 
	return BST;//查找成功,返回结点的找到结点的地址 
} 

二叉树的查找操作——迭代

Position IterFind(ElementType X,BinTree BST)
{
	while(BST)
	{
		if(X>BST->Data)
		BST=BST->Right;//向右子树中移动,继续查找 
		else if(X<BST->Data)
		BST=BST->Left;//向左子树中移动,继续查找 
		else 
		return BST;
	}
	return NULL;//查找失败 
}

总的来说迭代比递归更容易理解,执行效率也更高。递归代码较简单。
查找的效率取决于树的高度。

查找最小元素——递归

Position FindMin(BinTree BST)
{
	if(!BST)//空的二叉搜索树,返回NULL 
	return NULL;
	if(!BST->Left)
	return BST;//找到最左叶结点,并返回 
	else 
	return FindMin(BST->Left);//沿左分支继续查找 
}

查找最大元素——迭代

Position FindMAX(BinTree BST)
{
	if(BST)
	while(BST->Right)
	{ 
		BST=BST->Right;//沿右分支继续查找 
	}
	return BST;
}

分别用递归和迭代方式查找最小和最大元素。

二叉树的插入

Position Insert(ElementType X,BinTree BST)
{
	if(!BST)
	{//若原树为空,生成并返回一个结点的二叉搜索树 
		BST=malloc(sizeof(struct BinTree));
		BST->Data=X;
		BST->Left=BST->Right=NULL;
	}
	
	//开始找要插入元素的位置 
	else if(X>BST->Data)
	BST->Right=Insert(X,BST->Right);//递归插入右子树 
	else if(X<BST->Data)
	BST->Left=Insert(X,BST->Left);//递归插入左子树 
	return BST; 
}

if(!BST)用来完成最后的插入操作,剩下的语句对插入的位置进行查找,return BST语句返回插入结点的位置。

二叉树的删除

Position Delete(ElementType X,BinTree BST)
{
	if(!BST)printf("要删除的元素未找到");
	else if(X>BST->Data)
	BST->Right=Delete(X,BST->Right);//右子树递归删除 
	else if(X<BST->Data)
	BST->Left=Delete(X,BST->Left);//左子树递归删除 
	else 
	{
		if(BST->Left&&BST->Right)
		{
			Position tmp=FindMin(BST->Right);//在右子树中找最小的元素填充删除结点 
			BST->Data=tmp->Data;
			BST->Right=Delete(BST->Data,BST->Right);
		}
		else 
		{//被删除结点有一个或无子结点 
			Position tmp=BST;
			if(!BST->Left)//有右孩子或无子结点 
			BST=BST->Right; 
			else if(!BST->Right)//有左孩子或无子结点 
			BST=BST->Left;
			free(tmp);
		}
		return BST;
	}
}

分为删除位置有左右子树与只有一个或无左右子树两种情况。
删除位置有左右子树的情况,此处采用了在右子树中查找最小值替换删除位置的方式(还可在左子树中查找最大值替换),然后需要完成替换位置结点的删除。
删除位置只有一个或无左右子树的情况下,只需让BST指向它的左子树或右子树进行替换,然后释放原来的BST即可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值