二叉搜索树查找,插入,删除

递归查找

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				//X==BST->Data;
		return BST;
}

迭代查找

Position Finde (BinTree BST,ElementType X){
	while(BST){
		if(BST->Data > X)
			BST=BST->Right;
		else if(BST->Data < X)
			BST=BST->Left;
		else
			break;
	}
	return BST;
}

查找最小元素(递归)

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

查找最大元素(递归)

Position FindMax(BinTree BST){
	if(!BST) return NULL;
	else if(!BST->Right) return BST;
	else return FindMax(BST->Right);
}

查找最小元素(迭代)

Position FindMin(BinTree BST){
	if(BST){
		while(BST->Left)
			BST=BST->Left;
	}
	return BST;
}

查找最大元素(迭代)

Position FindMax(BinTree BST){
	if(BST){
		while(BST->Right)
			BST=BST->Right;
	}
	return BST;
}

二叉搜索树的插入

//在前面 Find(BST,X),若找到X,而不实现插入
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->Right = Insert(BST->Right,X);
		// else X 已经存在,什么都不做
	}
	return BST;
}

二叉搜索树的删除

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{
			if(BST->Left && BST->Right){					//被删除的结点左右两个子结点
				Tmp= FindMin(BST->Right);					//将找到最小的结点(BST->Right中)的Data赋值给被删结点
				BST->Data=Tmp->Data;
				BST->Right=Delete(BST->Right,BST-Data);		//在右子树中删去刚刚找到最小结点,执行下面操作
			}
			else{
				Tmp=BST;
				if(!BST->Left)								//只有右孩子或者无子结点
					BST=BST->Right;
				else 
					BST=BST->Left;							//只有左孩子,将左孩子 给BST。
				free(Tmp);
			}
		}
	}
	return BST;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值