以下代码为二叉排序树的插入、删除与查找。主要的算法参考了严蔚敏老师的数据结构教材。在VC++ 6.0 和 Dev-C++下编译通过。
#include "stdio.h"
#include "stdlib.h"
typedef struct BiTNode
{
struct BiTNode *lchild, *rchild;
int data;
} BiTNode, *BiTree;
BiTree Root;
int SearchBST(BiTree T, int key, BiTree f, BiTree &p)
{
int val;
if(!T)
{
p = f;
return 0;
}
else if(key==T->data)
{
p = T;
return 1;
}
else if(key<T->data)
val=SearchBST (T->lchild, key, T, p );
else
val=SearchBST (T->rchild, key, T, p );
return val;
}
int InsertBST(BiTree &T, int e )
{
BiTree s,p;
if (!SearchBST ( T, e, NULL, p ))
{
s = (BiTree)malloc(sizeof (BiTNode));
s->data=e;
s->lchild=s->rchild=NULL;
if( !p )
T = s;
else if( e < p->data )
p->lchild = s;
else
p->rchild = s;
return 1;
}
else
return 0;
}
void Delete(BiTree &p)
{
BiTree q,s;
int w;
w=1;
w=2;
if(!p->rchild)
{
q=p;
p=p->lchild;
free(q);
}
else if(!p->lchild)
{
q=p;
p=p->rchild;
free(q);
}
else
{
q=p;
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);
}
}
int DeleteBST (BiTree &T, int key )
{
int val;
if (!T)
return 0;
else
{
if (key==T->data)
{
Delete (T);
return 1;
}
else if(key<T->data)
val=DeleteBST(T->lchild, key);
else
val=DeleteBST(T->rchild, key);
}
return val;
}
int main()
{
BiTree p;
int sel,val,e,flag=1;
Root=NULL;
while(flag)
{
printf("\n#############################################\n");
printf("1. insert 2. search 3. delete");
printf("\n#############################################\n");
scanf("%d",&sel);
switch(sel)
{
case 1: printf("Please input an integer:\n");
scanf("%d",&e);
InsertBST(Root, e);
break;
case 2: printf("Please input an integer:\n");
scanf("%d",&e);
val=SearchBST(Root, e, NULL, p);
if(val==1)
printf("It exist.");
else
printf("It doesn't exist.");
getchar();
break;
case 3: printf("Please input an integer:\n");
scanf("%d",&e);
DeleteBST(Root, e);
break;
}
}
return 0;
}