平衡二叉有序树的插入

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{int z,cha;
struct node *zuo,*you;
}node,*node1;                        //结点 
node *jianli(node1 *w,int k)
{node *s,*fa,*fp,*a,*b,*p,*c;
s=(node1)malloc(sizeof(node));
s->cha=0;
s->z=k;
s->you=0;
s->zuo=0;                             //新结点 
if(*w==0)
*w=s;
else
{p=*w;
fa=0;
a=*w;
fp=0;
while(p!=0)
{if(p->cha!=0)
{a=p;
fa=fp;
}
fp=p;
if(k<p->z)
p=p->zuo;
else
p=p->you;
}                  //找距离离新结点插入位置最近的可能失衡的a节点位置 
if(k>fp->z)
p->you=s;
else
p->zuo=s;                //插入新结点 
if(k<a->z)
{b=a->zuo;
a->cha+=1;
}
else
{b=a->you;
a->cha-=1;
}          //修改新节点插入后a结点的平衡因子 
p=b;
while(p!=s)
if(k<p->z)
{p->cha=1;
p=p->zuo;
}
else
{p->cha=-1;
p=p->you;
}                 //修改b到s途中结点的平衡因子 
if(a->cha==2&&b->cha==1)
{a->zuo=b->you;
b->you=a;
a->cha=0;
b->cha=0;
if(fa==0)
*w=b;
else if(a==fa->zuo)
fa->zuo=b;
else
fa->you=b;
}                                            //LL型 
else if(a->cha==2&&b->cha==-1)
{c=b->you;
b->you=c->zuo;
a->zuo=c->you;
c->zuo=b;
c->you=a;
if(k<c->z)
{a->cha=-1;
b->cha=0;
c->cha=0;
}
else if(k>c->z)
{a->cha=0;
b->cha=1;
c->cha=0;
}
else
{a->cha=0;
b->cha=0;
}
if(fa==0)
*w=c;
else if(a==fa->zuo)
fa->zuo=c;
else
fa->you=c;
}                                       //LR型 
else if(a->cha==-2&&b->cha==1)
{c=b->zuo;
a->you=c->zuo;
b->zuo=c->you;
c->zuo=a;
c->you=b;
if(k<c->z)
{a->cha=0;
b->cha=-1;
c->cha=0;
}
else if(k>c->z)
{a->cha=1;
b->cha=0;
c->cha=0;
}
else
{a->cha=0;
b->cha=0;
}
if(fa==0)
*w=c;
else if(a==fa->zuo)
fa->zuo=c;
else
fa->you=c;
}                                                   //RL型 
else if(a->cha==-2&&b->cha==-1)
{a->you=b->zuo;
b->zuo=a;
a->cha=0;
b->cha=0;
if(fa==0)
*w=b;
else if(a==fa->zuo)
fa->zuo=b;
else
fa->you=b;
}                                  //RR型 
}
return *w;
}            //平衡二叉排序树的插入,二建立只需多次调用词函数即可 
int main()
{node1 *w;
node *m;
w=&m; 
int k;
*w=0;
scanf("%d",&k);
m=jianli(w,k);                  //再次只是练习插入 
} 
在这里插入代码片

猜你喜欢

转载自blog.csdn.net/feiqipengcheng/article/details/84611398