插入算法:
void InsertBFS(BSTree *a,Elemtype b)
{
if(!(*a))//*如果树为空
{
BSTree c;
c=(BSTree)malloc(sizeof(BSTNode));
c->lchild=c->rchild=NULL;
c->data=b;
*a=c;
}
else if(b.key<(*a)->data.key)//*如果插入的结点小于树结点
{
InsertBFS(&(*a)->lchild,b);//*插入左子树
}
else
{
InsertBFS(&(*a)->rchild,b);//*插入右子树
}
}
删除算法:
void DeleteBFS(BSTree *a,KeyType key)
{
BSTree f,p,q,s;
p=*a;//**p指向根节点
f=NULL;
while(p)//*查找数据,使*p指向正确的结点
{
f=p;
if(key<p->data.key)//*如果被删除结点小于*p,则让*p指向左子树
{
p=p->lchild;
}
else if(key>p->data.key)
{
p=p->rchild;//*指向右子树
}
else
{
break;//*如果查找成功
}
}
if(!p)//*如果结点不存在
{
printf("删除失败!\n");
return;
}
q=p;
if((p->lchild)&&(p->rchild))
{
s=p->lchild;
while(s->rchild)
{
q=s;
s=s->rchild;
}
p->data=s->data;
if(q!=p)//*如果*s的前驱不为*p
{
q->rchild=s->lchild;//*重接右子树
}
else
{
q->lchild=s->lchild;//*重接左子树
}
free(s);
return;
}
else if(!p->lchild)
{
p=p->rchild;
}
else if(!p->rchild)
{
p=p->lchild;
}
if(!f)
{
*a=p;
}
else if(q==f->lchild)
{
f->lchild=p;
}
else
{
f->rchild=p;
}
free(q);
}
查找算法:
BSTree Print_cha(BSTree a,KeyType key)
{
if((!a)||(a->data.key==key))//*如果查找到或结点不存在
{
return a;
}
else if(key<a->data.key)
{
return Print_cha(a->lchild,key);
}
else
{
return Print_cha(a->rchild,key);
}
}
整体算法如下:
#include <stdio.h>
#include <stdlib.h>
typedef long long int KeyType;
typedef int Infotype;
typedef struct
{
KeyType key;
Infotype otherinfo;
}Elemtype;
typedef struct BSTNode
{
Elemtype data;
struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;
void InsertBFS(BSTree *a,Elemtype b)
{
if(!(*a))
{
BSTree c;
c=(BSTree)malloc(sizeof(BSTNode));
c->lchild=c->rchild=NULL;
c->data=b;
*a=c;
}
else if(b.key<(*a)->data.key)
{
InsertBFS(&(*a)->lchild,b);
}
else
{
InsertBFS(&(*a)->rchild,b);
}
}
void CreateBFS(BSTree *a,KeyType end_flag)
{
KeyType key;
printf("请输入您要插入的数据:");
scanf("%lld",&key);
fflush(stdin);
while(key!=end_flag)
{
Elemtype data;
data.key=key;
data.otherinfo=rand();
InsertBFS(a,data);
printf("请输入您要插入的数据:");
scanf("%lld",&key);
fflush(stdin);
}
}
void DeleteBFS(BSTree *a,KeyType key)
{
BSTree f,p,q,s;
p=*a;
f=NULL;
while(p)
{
f=p;
if(key<p->data.key)
{
p=p->lchild;
}
else if(key>p->data.key)
{
p=p->rchild;
}
else
{
break;
}
}
if(!p)
{
printf("删除失败!\n");
return;
}
q=p;
if((p->lchild)&&(p->rchild))
{
s=p->lchild;
while(s->rchild)
{
q=s;
s=s->rchild;
}
p->data=s->data;
if(q!=p)
{
q->rchild=s->lchild;
}
else
{
q->lchild=s->lchild;
}
free(s);
return;
}
else if(!p->lchild)
{
p=p->rchild;
}
else if(!p->rchild)
{
p=p->lchild;
}
if(!f)
{
*a=p;
}
else if(q==f->lchild)
{
f->lchild=p;
}
else
{
f->rchild=p;
}
free(q);
}
void Delete(BSTree *a,KeyType end_flag)
{
KeyType key;
printf("请输入您要删除的数据:");
scanf("%lld",&key);
fflush(stdin);
while(key!=end_flag)
{
DeleteBFS(a,key);
printf("请输入您要删除的数据:");
scanf("%lld",&key);
fflush(stdin);
}
}
BSTree Print_cha(BSTree a,KeyType key)
{
if((!a)||(a->data.key==key))
{
return a;
}
else if(key<a->data.key)
{
return Print_cha(a->lchild,key);
}
else
{
return Print_cha(a->rchild,key);
}
}
void Print(BSTree a,KeyType end_flag)
{
KeyType key;
printf("请输入您要插入的数据:");
scanf("%lld",&key);
fflush(stdin);
while(key!=end_flag)
{
BSTree data;
data=Print_cha(a,key);
if(!data)
{
printf("NULL!\n");
}
else
{
printf("%lld->%d\n",data->data.key,data->data.otherinfo);
}
printf("请输入您要插入的数据:");
scanf("%lld",&key);
fflush(stdin);
}
}
main()
{
srand((unsigned)time(NULL));
BSTree a=NULL;
for(;;)
{
printf("1.查询\n2.插入\n3.删除\n4.按其他键退出\n");
char b=getch();
if((b>'3')||(b<'1'))
{
return 0;
}
else
{
KeyType end_flag;
printf("请输入结束标志:");
scanf("%lld",&end_flag);
fflush(stdin);
switch(b)
{
case '1':Print(a,end_flag);break;
case '2':CreateBFS(&a,end_flag);break;
case '3':Delete(&a,end_flag);break;
}
}
}
}
程序运行如下:
1.查询
2.插入
3.删除
4.按其他键退出
请输入结束标志:2
请输入您要插入的数据:5
请输入您要插入的数据:2
1.查询
2.插入
3.删除
4.按其他键退出
请输入结束标志:
10
请输入您要插入的数据:5
5->6430
请输入您要插入的数据:10
1.查询
2.插入
3.删除
4.按其他键退出