伪代码:
/*折半查找*/
int binary_search(int *a,int n,int key)
{
int low,height,mid;
low=0;
height=n-1;
while(height>=low)
{
mid=(height+low)/2;
if(key<a[mid])
{
height=mid-1;
}else if(key>a[mid])
{
low=mid+1;
}
else
{
return mid;
}
}
return 0;
}
/*二叉排序树*/
/*二叉链表*/
typedef int TElemType ;
typedef struct _Node
{
TElemType data;
struct _Node *lchild,*rchild;
}Node,*NodePtr;
int SearchBST(NodePtr T,int key,NodePtr s,NodePtr* p)
{
if(!T)
{
*p=s;
return 0;
}
if(key==T->data)
{
*p=T;
return 1;
}else if(key<T->data)
{
SearchBST(T->lchild,key,T,p);
}else
{
SearchBST(T->rchild,key,T,p);
}
}
int InsertBST(NodePtr* T,int key)
{
NodePtr p,s;
if(!SearchBST(*T,key,NULL,&p))
{
s=(NodePtr)malloc(sizeof(Node));
s->data=key;
s->lchild=s->rchild=NULL;
if(!p)
{
*T=s;
}else if(key<p->data)
{
p->lchild=s;
}else if(key>p->data)
{
p->rchild=s;
}
return 1;
}
return 0;
}
int DeleteBST(NodePtr* T,int key)
{
if(!(*T))
{
return 0;
}
if((*T)->data==key)
{
Delete(T);
}else if(key<(*T)->data)
{
DeleteBST(&((*T)->lchild),key);
}else if(key >(*T)->data)
{
DeleteBST(&((*T)->rchild),key);
}
return 1;
}
int Delete(NodePtr* p)
{
NodePtr q,s;
if((*p)->lchild==NULL&&(*p)->rchild!=NULL)
{
q=*p;*p=(*p)->rchild;free(q);
}else if((*p)->rchild==NULL&&(*p)->lchild!=NULL)
{
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);
}
}