二叉排序树的 搜索、插入、删除节点的c语言描述的算法。
main()中用了一组测试数据
#include "stdio.h"
#include "stdlib.h"
#define MAX 6
typedef struct node
{
int data;
struct node *lchild;
struct node *rchild;
}NODE,*NODEP;
;
int DeleteBST(NODEP *r,int key);
int SearchBST(NODEP r,int key,NODEP *f, NODEP *p) ;
int InsertBST(NODEP *r,int key);
void MidOrder(NODEP r);
void main()
{
int a[]={74,13,26,98,6,24};
int i;
NODEP r=NULL;
for(i=0;i<MAX;i++)
{
InsertBST(&r,a[i]);
}
MidOrder(r);
printf("/n");
DeleteBST(&r,13);
MidOrder(r) ;
}
void MidOrder(NODEP p)
{
if(!p)
{
return;
}
MidOrder(p->lchild) ;
printf("%d ",p->data) ;
MidOrder(p->rchild) ;
}
int SearchBST(NODEP r,int key,NODEP *f,NODEP *p)
{
if(!r)
{
*p=*f;
return 0;
}
else
{
if(r->data==key)
{
*p=r;
return 1;
}
else if(r->data <key)
{
*f=r;
SearchBST(r->rchild,key,f,p) ;
}
else
{
*f=r;
SearchBST(r->lchild,key,f,p) ;
}
}
}
int InsertBST(NODEP *r,int key)
{
NODEP p=NULL,q,f=NULL;
if(!SearchBST(*r,key,&f,&p))
{
q=(NODEP)malloc(sizeof(NODE)) ;
q->data=key;
q->lchild=NULL;
q->rchild=NULL;
if(!p)
{
*r=q;
}
else if(p->data>key)
{
p->lchild=q;
}
else
{
p->rchild=q;
}
}
return 1;
}
int DeleteBST(NODEP *r,int key)
{
NODEP p=NULL,f=NULL,q,s;
if(SearchBST(*r,key,&f,&p))
{
if(!p->rchild)
{
q=p;
if(f==NULL) *r=p->lchild;
else
{
if(f->lchild==p)
f->lchild=p->lchild;
else
f->rchild=p->lchild;
}
free(q) ;
}
else if(!p->lchild)
{
q=p;
if(f==NULL) *r=p->rchild;
else
{
if(f->lchild==p)
f->lchild=p->rchild;
else
f->rchild=p->rchild;
}
free(q) ;
}
else
{
q=p->lchild;
s=p;
while(q->rchild)
{ s=q;
q=q->rchild;
}
p->data=q->data;
if(s==p)
s->lchild=q->lchild;
else
s->rchild=q->lchild;
free(q);
}
return 1;
}
return 0;
}
main()中用了一组测试数据
#include "stdio.h"
#include "stdlib.h"
#define MAX 6
typedef struct node
{
int data;
struct node *lchild;
struct node *rchild;
}NODE,*NODEP;
;
int DeleteBST(NODEP *r,int key);
int SearchBST(NODEP r,int key,NODEP *f, NODEP *p) ;
int InsertBST(NODEP *r,int key);
void MidOrder(NODEP r);
void main()
{
int a[]={74,13,26,98,6,24};
int i;
NODEP r=NULL;
for(i=0;i<MAX;i++)
{
InsertBST(&r,a[i]);
}
MidOrder(r);
printf("/n");
DeleteBST(&r,13);
MidOrder(r) ;
}
void MidOrder(NODEP p)
{
if(!p)
{
return;
}
MidOrder(p->lchild) ;
printf("%d ",p->data) ;
MidOrder(p->rchild) ;
}
int SearchBST(NODEP r,int key,NODEP *f,NODEP *p)
{
if(!r)
{
*p=*f;
return 0;
}
else
{
if(r->data==key)
{
*p=r;
return 1;
}
else if(r->data <key)
{
*f=r;
SearchBST(r->rchild,key,f,p) ;
}
else
{
*f=r;
SearchBST(r->lchild,key,f,p) ;
}
}
}
int InsertBST(NODEP *r,int key)
{
NODEP p=NULL,q,f=NULL;
if(!SearchBST(*r,key,&f,&p))
{
q=(NODEP)malloc(sizeof(NODE)) ;
q->data=key;
q->lchild=NULL;
q->rchild=NULL;
if(!p)
{
*r=q;
}
else if(p->data>key)
{
p->lchild=q;
}
else
{
p->rchild=q;
}
}
return 1;
}
int DeleteBST(NODEP *r,int key)
{
NODEP p=NULL,f=NULL,q,s;
if(SearchBST(*r,key,&f,&p))
{
if(!p->rchild)
{
q=p;
if(f==NULL) *r=p->lchild;
else
{
if(f->lchild==p)
f->lchild=p->lchild;
else
f->rchild=p->lchild;
}
free(q) ;
}
else if(!p->lchild)
{
q=p;
if(f==NULL) *r=p->rchild;
else
{
if(f->lchild==p)
f->lchild=p->rchild;
else
f->rchild=p->rchild;
}
free(q) ;
}
else
{
q=p->lchild;
s=p;
while(q->rchild)
{ s=q;
q=q->rchild;
}
p->data=q->data;
if(s==p)
s->lchild=q->lchild;
else
s->rchild=q->lchild;
free(q);
}
return 1;
}
return 0;
}