平衡二叉有序樹的插入
阿新 • • 發佈:2018-11-29
#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); //再次只是練習插入 } 在這裡插入程式碼片