#include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define EH 0 #define LH 1 #define RH -1 //平衡二叉树的节点结构 typedef struct BiTNode{ int data; int bf;//平衡因子 BiTNode *lchld,*rchild; }BiTNode,*BiTree; typedef int Status; //LL调整 void R_Rotate(BiTree &T) { BiTree p; p=T->lchild; T->lchild=p->rchild; p->rchild=T; T=p; } //RR调整 void L_Rotate(BiTree &T) { BiTree p; p=T->rchild; T->rchild=p->lchild; p->lchild=T; T=p; } //左平衡处理LL,LR void LeftBalance(BiTree &T) { BiTree L,LR; L=T->lchild; switch(L->bf) { case 0: L->bf=-1; T->bf=1; R_Rotate(T); break; case 1: L->bf=T->bf=0; R_Rotate(T); break; case -1: LR=L->rchild; switch(LR->bf) { case 0: L->bf=T->bf=0; case -1: T->bf=0; L->bf=1; break; case 1: L->bf=0; T->bf=-1; break; default: break; } LR->bf=0; L_Rotate(T->lchild); R_Rotate(T); break; default: break; } } //右平衡处理RR,RL void RightBalance(BiTree &T) { BiTree R,RL;//调用函数,T为根,右边高于左边T->bf=-1; R=T->rchild;//R是T的右孩子 switch(R->bf) { case -1://如果T时右孩子和T它们的平衡因子相同,直接左旋。 T->bf=R->bf=0; L_Rotate(T); break; case 0: T->bf=-1; R->bf=1; L_Rotate(T); break; case 1: RL=R->lchild; switch(RL->bf) { case 0: T->bf=R->bf=0; break; case -1: R->bf=0; T->bf=1; break; case 1: R->bf=-1; T->bf=0; break; default: break; } RL->bf=0; R_Rotate(T->rchild); L_Rotate(T); break; } } bool InsertAVLTree(BiTree &T,int key,bool taller) { if(!T)//T为空 { T=(BiTree)malloc(sizeof(BiTNode)); T->bf=0; T->lchild=T->rchild=NULL; T->data=key; taller=true; return true; } else { if(key==T->data)//已经存在key相同的元素,不用插入,返回false { taller=false; return false; } if(key<T->data)//所插入的元素小于根的值,找他的左孩子比较 { if(!InsertAVLTree(T->lchild,key,taller)) { return false; } if(taller) { switch(T->bf) { case 0: T->bf=1; taller=true; break; case 1: LeftBalance(T); taller=false; break; case -1: T->bf=0; taller=false; break; default: break; } } else { if(!InsertAVLTree(T->rchild,key,taller)) { return false; } if(taller) { switch(T->bf) { case 0: T->bf=-1; taller=true; break; case 1: T->bf=0; taller=false; break; case -1: RightBalance(T); taller=false; break; default: break; } } } } } }