头文件 BinSTree.h:
#define maxsize 100
typedef int KeyType;
typedef struct
{
KeyType key;
}DataType;
typedef struct BinSTreeNode
{
DataType elem;
struct BinSTreeNode *lchild;
struct BinSTreeNode *rchild;
}*BinSTree;//二叉排序树
源程序:
#include<iostream>
#include"BinSTree.h"
using namespace std;
BinSTree BSTreeSearch(BinSTree t,KeyType k)//查找
{
if(t==NULL)return NULL;
if(t->elem.key==k) {cout<<"查找成功!"<<endl;return t;}
if(t->elem.key>k)
return BSTreeSearch(t->lchild,k);
else
return BSTreeSearch(t->rchild,k);
}
void BSTreeInsert(BinSTree *t,KeyType k)//插入
{
BinSTree r;
if(*t==NULL)
{
r=(BinSTree)malloc(sizeof(struct BinSTreeNode));
r->elem.key=k;
//cout<<k<<endl;
r->lchild=r->rchild=NULL;
*t=r;
return ;
}
else if(k<(*t)->elem.key)
{
//cout<<"左"<<endl;
BSTreeInsert(&((*t)->lchild),k);
}
else
{
//cout<<"右"<<endl;
BSTreeInsert(&((*t)->rchild),k);
}
}
int BSTreeDelete(BinSTree *bt,KeyType k)//删除
{
BinSTree f,p,q,s;
p=*bt;
f=NULL;
while(p&&p->elem.key!=k)
{
f=p;//指向双亲结点的指针
if(p->elem.key>k)p=p->lchild;
else p=p->rchild;
}
if(p==NULL) return 0;
if(p->lchild==NULL)
{
if(f==NULL)
*bt=p->lchild;//表示删除头结点
else if(f->lchild==p)
f->lchild=p->rchild;
else
f->rchild=p->rchild;
free(p);
cout<<"删除成功!"<<endl;
return 1;
}
else
{
q=p;
s=p->lchild;
while(s->rchild)//s保存左子树最大结点
{
q=s;
s=s->rchild;
}
if(q==p)
q->lchild=s->lchild;
else
q->rchild=s->lchild;
p->elem.key=s->elem.key;
free(s);
cout<<"删除成功!"<<endl;
return 1;
}
}
int main()
{
int i;
BinSTree t=NULL;
//t=(BinSTree)malloc(sizeof(BinSTree));
for(i=0;i<10;i++)
{
BSTreeInsert(&t,i);
}
BSTreeSearch(t,5);
BSTreeDelete(&t,5);
BSTreeInsert(&t,5);
return 0;
}