二叉排序数(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>