
#define EQ(x,m) ( x == m ? 1 : 0)
#define LT(x,m) ( x < m ? 1 : 0)
typedef int Element;
typedef struct tag_Tree
{
Element data;
struct tag_Tree * lchild;
struct tag_Tree * rchild;
}*BiTree,BiTNode;
int SearchBST(BiTree T,Element key,BiTree f,BiTree * p)
{
if(!T)
{
*p = f;
return 0;
}
else if( EQ(key,T->data) )
{
p = T;
return 1;
}
else if( LT(key,T->data) )
{
return SearchBST(T->lchild,key,T,p);
}
else
{
return SearchBST(T->rchild,key,T,p);
}
}
int InsertBST(BiTree * T , Element e)
{
BiTree s,p,f;
if( !SearchBST(*T,e,0,&p) )
{
s = (BiTree) malloc( sizeof(BiTNode) );
s -> data = e;
s -> lchild = s -> rchild = 0;
if( ! p ) *T = s;
else if ( LT(e,p->data))
{
p -> lchild = s;
}
else
{
p -> rchild = s;
}
return 1;
}
else
return 0;
}
int DeleteBST(BiTree * T,Element e)
{
if(!(*T))
{
return 0;
}
else
{
if( EQ(e,(*T)->data) )
{
return DeleteSearch(T);
}
else if( LT(e,(*T)->data) )
{
return DeleteBST(&((*T)->lchild),e);
}
else
return DeleteBST(&((*T)->rchild),e);
}
}
int DeleteSearch(BiTree* T)
{
BiTree q,s;
if(!(*T))
return 0;
if( ! (*T)->lchild )
{
q = *T;
(*T) = (*T)->rchild;
free(q);
}
else if( ! (*T)->rchild)
{
q = *T;
(*T) = (*T)->lchild;
free(q);
q=0;
}
else
{
q = (*T);
s = (*T) -> lchild;
while( s ->rchild )
{
q = s;
s = s->rchild;
}
(*T)->data = s ->data;
if ( q != (*T)) q->rchild = s ->lchild;
else
{
q ->lchild = s ->lchild;
}
free(s);
}
}
void showTree(BiTree T)
{
if(!T) return ;
printf("%d ", T->data);
showTree(T->lchild);
showTree(T->rchild);
}
main()
{
int a[20]={45,24,53,12,13,15,14,37,90};//"hello world!";
int n = 0;
BiTree T = 0;
BiTree f = 0;
BiTree p = 0;
while( n < 9)
{
InsertBST(&T , a[n]);
n++;
}
showTree(T);
printf("\n");
if(! SearchBST(T,53,0,&p) )
printf("error\n");
DeleteBST(&T,24);
showTree(T); printf("\n");
}