二叉排序树

二叉排序数(Binary Sort Tree)又称为二叉查找树,它或者是一棵空树,或者是具有下列性质的二叉树:

  • 若它的左子树不为空,则左子树上所有结点的值均小于它的根结构的值;
  • 若它的右子树不为空,则右子树上所有结点的值均大于它的根结构的值;
  • 它的左、右子树也分别为二叉排序树(递归)。

构造一棵二叉排序树的目的,其实不是为了排序,而是为了提高查找和插入删除关键字的速度。在一个有序数据集上的查找,速度总是要快于无序的数据集的,而二叉排序树这种非线性的结构,也有利于插入和删除的实现。

<span style="font-family:Microsoft YaHei;font-size:18px;">#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0

typedef int Status;

//二叉树的二叉链表结点结构定义
typedef struct BiTree
{

	int data;						//结点数据
	struct BiTree *lchild,*rchild;	//左右孩子的指针

}BiNode,*BiTree;

//二叉排序树的查找
Status SearchBST(BiTree T,int key,BiTree f,BiTree *p)
{
	if(!T)				//查找不成功
	{
		*p=f;
		return FALSE;
	}
	else if (key == T->data)	//查找成功
	{
		*p=T;
		return TRUE;
	}
	else if(key > T->data)
		return SearchBST(T->rchild,key,T,p);//在左子树继续查找
	else
		return SearchBST(T->lchild,key,T,p);
}

//二叉排序树插入操作
//当二叉排序树T中不存在关键字等于key的数据元素时
//插入key并返回TRUE,否则返回FALSE
Status InsertBST(BiTree *T,int key)
{
	BiTree p,s;
	if(!SearchBST(*T,key,NULL,&p))//查找不成功
	{
		s=(BiTree)malloc(sizeof(BiNode));
		s->data = key;
		s->lchild = s->rchild = NULL;
		if(!p)
			*T = s;				//插入s为新的根结点
		else if(key < p->data)
			p->lchild = s;		//插入s为左孩子
		else
			p->rchild = s;		//插入s为右孩子
		return TRUE;
	}
	else
		return FALSE;			//树中已有关键字相同的结点,不再插入
}

//从二叉排序树中删除结点p,并重接它的左或者右子树
Status Delete(BiTree *p)
{
	BiTree q,s;
	if((*p)->rchild == NULL)		//右子树空则只需要重接它的左子树
	{
		q=*p;
		*p=(*p)->lchild;
		free(q);
	}
	else if((*p)->lchild == NULL)	//左子树空则只需要重接它的右子树
	{
		q=*p;
		*p=(*p)->rchild;
		free(q);
	}
	else	//左右子树均不空
	{
		q=*p;
		s=(*p)->lchild;		//转左,然后向右到尽头(找待删结点的前驱)
		{
			q=s;
			s=s->rchild;
		}
		(*p)->data=s->data;	//s指向被删结点的直接前驱
		if(q!=*p)
			q->rchild=s->lchild;	//重接q的右子树
		else
			q->lchild=s->lchild;
		free(s);
	}
	return TRUE;
}


//若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点
//并返回TRUE;否则返回FALSE
Status DeleteBST(BiTree *T,int key)
{
	if(!T)		//不存在关键字等于key的数据元素
		return FALSE;
	else
	{
		if(key == (*T)->data) //找到关键字等于key的数据元素
			return Delete(T);
		else if(key < (*T)->data)
			return DeleteBST(&(*T)->lchild,key);
		else
			return DeleteBST(&(*T)->rchild,key);
	}
}

int main()
{
	//二叉排序树的创建
	int i;
	int a[10]={62,88,58,47,35,73,51,99,37,93};
	BiTree T=NULL;
	for(i=0;i<10;i++)
	{
		InsertBST(&T,a[i]);
	}
	DeleteBST(&T,93);
	DeleteBST(&T,47);

	return 0;
}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值