#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
今日推荐
周排行