4.4 二叉搜索树

本文详细介绍了二叉搜索树的基本操作,包括递归和非递归实现的查找算法,以及如何进行插入和删除节点。在删除操作中,考虑了节点可能有的左右子节点情况,确保树的平衡。这些基本操作对于理解和应用二叉搜索树至关重要。
摘要由CSDN通过智能技术生成

1.动态查找

/*递归*/ 
Position Find(BinTree BST,ElementType X)
{
	if(!BST) return NULL;
	
	if(X>BST->Data) return Find(BST->Right,X);
	else if(X<BST->Data) return Find(BST->Left,X);
	else return BST;
}

/*非递归*/
Position Find(BinTree BST,ElementType X)
{
	while(BST)
	{
		if(X>BST->Data) BST=BST->Right;
		else if(X<BST->Data) BST=BST->Left;
		else break;
	}
	return BST;
}

2.插入

BinTree Insert(BinTree BST,ElementType X)
{
	if(!BST)  /*若原数为空,生成并返回一个结点的二叉搜索树*/
	{
		BST=(BinTree)malloc(sizeof(struct TNode));
		BST->Data=X;
		BST->Left=BST->Right=NULL; 
	}
	else
	{
		if(X<BST->Data) BST->Left=Insert(BST->Left,X);
		else if(X>BST->Data) BST->Tight=Insert(BST->Right,X);
		/*else X已存在。什么都不做*/ 
	}
	return BST;
}

/*只能插入叶结点?*/

3.删除

BinTree Delete(BinTree BST,ElementType X)
{
	Position Tmp;
	if(!BST) printf("要删除的元素为找到");
	else
	{
		if(X<BST->Data) BST->Left=Delete(BST->Left,X);
		else if(X>BST->Data) BST->Right=Delete(BST->Right,X);
		else
		{
			/*BST就是要被删除的结点*/
			/*如果被删除的结点有左右两个子结点*/
			if(BST->Left&&BST->Right)
			{
				Tmp=FindMin(BST->Right);   /*从右子树中找最小的元素填充删除结点*/ 
				BST->Data=Tmp->Data;
				BST->Right=Delete(BST->Right,BST->Data);    /*从右子树中删除最小元素*/ 
			}
			else
			{
				/*被删除结点有一个或无结点*/
				Tmp=BST;
				if(!BST->Left) BST=BST->Right;   /*只有右孩子或无子结点*/ 
			    else BST=BST->Left;        /*只有左孩子*/ 
				free(Tmp);
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值