最近在复习数据结构,对于二叉排序树,看了一些书,参考别人的思想写出了这个代码,希望看到的人给点修改建议
代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct bitree
{
int data;
struct bitree *pLeft;
struct bitree *pRight;
}Bitree;
typedef struct bitree * iBitree;
iBitree q;
int Searchtree(iBitree s,int dt,iBitree p)
{
if(s == NULL)
{
q = p;
return 0;
}
else
{
if(s->data == dt)
{
q = p;
return 1;
}
else if(dt < s->data)
return Searchtree(s->pLeft,dt,s);
else
return Searchtree(s->pRight, dt,s);
}
}
iBitree CreateBitree(iBitree s,int dt)
{
iBitree p;
if(!Searchtree( s, dt,NULL))
{
p = (iBitree)malloc(sizeof(Bitree));
p->data = dt;
p->pLeft=p->pRight=NULL;
if(q==NULL)
s=p;
else
{
if(q->data > dt )
{
q->pLeft = p;
}
else
{
q->pRight = p;
}
}
}
return s;
}
iBitree Delete(iBitree s,int num)
{
iBitree p,r,t;
if(s->data == num)
{
if((s->pRight == NULL)&&(s->pLeft !=NULL))
{
p = s;
s = s->pLeft;
free(p);
}
else if((s->pRight != NULL)&&(s->pLeft ==NULL))
{
p = s;
s = s->pRight;
free(p);
}
else
{
if((s->pRight == NULL)&&(s->pLeft ==NULL))
free(s);
else
{
r = s;
p = s->pLeft;
while(p->pRight != NULL)
{
p=p->pRight;
}
p->pRight = s->pRight;
s = s->pLeft;
free(r);
}
}
}
else
{
if(Searchtree(s, num, NULL))
{
if(q->pLeft->data == num)
{
p = q->pLeft;
if((p->pRight == NULL)&&(p->pLeft !=NULL))
{
r = p;
q->pLeft= p->pLeft;
free(r);
}
else if((p->pRight != NULL)&&(p->pLeft ==NULL))
{
r = p;
q->pLeft= p->pRight;
free(r);
}
else
{
if((p->pRight == NULL)&&(p->pLeft ==NULL))
free(r);
else
{
r=p;
t = p->pLeft;
while(t->pRight != NULL)
{
t = t->pRight;
}
t->pRight = p->pRight;
q->pLeft = p->pLeft;
free(r);
}
}
}
else
{
p = q->pRight;
if((p->pRight == NULL)&&(p->pLeft !=NULL))
{
r = p;
q->pRight= p->pLeft;
free(r);
}
else if((p->pRight != NULL)&&(p->pLeft ==NULL))
{
r = p;
q->pRight= p->pRight;
free(r);
}
else
{
if((p->pRight == NULL)&&(p->pLeft ==NULL))
free(r);
else
{
r=p;
t = p->pLeft;
while(t->pRight != NULL)
{
t = t->pRight;
}
t->pRight = p->pRight;
q->pRight= p->pLeft;
free(r);
}
}
}
}
}
return s;
}
void inTrvel(iBitree s)
{
iBitree q = s;
if(q != NULL)
{
inTrvel(q->pLeft);
printf("%d ",q->data);
inTrvel(q->pRight);
}
}
int main()
{
int a[10] = {20,34,45,12,64,23,85,74,93,33};
iBitree root = NULL;
int i;
for(i = 0; i< 10;i++)
{
root = CreateBitree(root,a[i]);
}
inTrvel(root);
printf("\n");
root = Delete(root, 45);
inTrvel(root);
printf("\n");
return 0;
}