二叉排序树

二叉排序树的 搜索、插入、删除节点的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;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值