Status InsertAVL(BSTree &T, ElemType e, Boolean &taller) { // 算法9.11 // 若在平衡的二叉排序树T中不存在和e有相同关键字的结点, // 则插入一个数据元素为e的新结点,并返回1,否则返回0。 // 若因插入而使二叉排序树失去平衡,则作平衡旋转处理, // 布尔变量taller反映T长高与否 if (!T) { // 插入新结点,树"长高",置taller为TRUE T = (BSTree) malloc (sizeof(BSTNode)); T->data = e; T->lchild = T->rchild = NULL; T->bf = EH; taller = TRUE; } else { if (EQ(e.key, T->data.key)) // 树中已存在和e有相同关键字的结点 { taller = FALSE; return 0; } // 则不再插入 if (LT(e.key, T->data.key)) { // 应继续在*T的左子树中进行搜索 if (InsertAVL(T->lchild, e, taller)==0) return 0; // 未插入 if (taller) // 已插入到*T的左子树中且左子树"长高" switch (T->bf) { // 检查*T的平衡度 case LH: // 原本左子树比右子树高,需要作左平衡处理 LeftBalance(T); taller = FALSE; break; case EH: // 原本左、右子树等高,现因左子树增高而使树增高 T->bf = LH; taller = TRUE; break; case RH: // 原本右子树比左子树高,现左、右子树等高 T->bf = EH; taller = FALSE; break; } // switch (T->bf) } // if else { // 应继续在T↑的右子树中进行搜索 if (InsertAVL(T->rchild, e, taller)==0) return 0; if (taller) // 已插入到*T的右子树且右子树长高 switch (T->bf) { // 检查*T的平衡度 case LH: // 原本左子树比右子树高,现左、右子树等高 T->bf = EH; taller = FALSE; break; case EH: // 原本左、右子树等高,现因右子树增高而使树增高 T->bf = RH; taller = TRUE; break; case RH: // 原本右子树比左子树高,需要作右平衡处理 RightBalance(T); taller = FALSE; break; } // switch (T->bf) } // else } // else return 1; } //InsertAVL
int main() { BSTree T=NULL; int n,m; Boolean taller; printf("输入二叉树节点数:"); scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&m); InsertAVL(T,m,taller); } PreOrderTraverse(T); return 0; }
void main() { BSTree dt, p; Status k; int i; KeyType j; ElemType r[N] = { {13,1},{24,2},{37,3},{90,4},{53,5} }; /* (以教科书图9.12为例) */ InitDSTable(&dt); /* 初始化空树 */ for (i = 0; i < N; i++) InsertAVL(&dt, r[i], &k); /* 建平衡二叉树 */ TraverseDSTable(dt, print); /* 按关键字顺序遍历二叉树 */ printf("\n请输入待查找的关键字: "); scanf("%d", &j); p = SearchBST(dt, j); /* 查找给定关键字的记录 */ if (p) print(p->data); else printf("表中不存在此值"); printf("\n"); DestroyDSTable(&dt); }
Status InsertAVL(BSTree &T,ElemType e,Boolean &taller) { if(!T) { T=(BSTNode*)malloc(sizeof(BSTNode)); if(!T)exit(0); T->data=e; T->lchild=T->rchild=NULL; taller=TRUE; T->bf=EH; } else { if(e==T->data)//子树没有增长 { taller=FALSE; return FALSE; } else if(e<T->data) { if(InsertAVL(T->lchild,e,taller)) if(taller) { switch (T->bf) { case LH: LeftBalance(T); taller=FALSE; break; case EH: T->bf=LH; taller=TRUE; break; case RH: T->bf=EH; taller=FALSE; break; } } } else { if(InsertAVL(T->rchild, e, taller)) if(taller) { switch(T->bf) { case LH: T->bf = EH; taller = FALSE; break; case EH: T->bf = RH; taller = TRUE; break; case RH: RightBalance(T); break; } } } } return OK; }
int InsertAVL(BSTree *T, ElemType *e, int *taller) { if (*T == NULL) { *T = (BSTree)malloc( sizeof(BSTNode) ); if (*T == NULL) { return ERROR; } (*T)->data = *e; (*T)->lchild = (*T)->rchild = NULL; (*T)->bf = EH; *taller = TRUE; } else { if (*e == (*T)->data) { *taller = FALSE; return FALSE; } if (*e < (*T)->data) //insert to T->lchild { if (InsertAVL( &((*T)->lchild), e, taller) == -1) // no insert { return FALSE; } //inserted if (*taller == TRUE) //taller { switch((*T)->bf) { case LH: LeftBalance(T); *taller = FALSE; break; case EH: (*T)->bf = LH; *taller = TRUE; break; case RH: (*T)->bf = EH; *taller = FALSE; break; } } } else //insert to T->rchild { if (InsertAVL( &((*T)->rchild), e, taller) == -1) //no insert { return FALSE; } //inserted if (*taller == TRUE) { switch ((*T)->bf) { case LH: (*T)->bf = EH; *taller = FALSE; break; case EH: (*T)->bf = RH; *taller = TRUE; break; case RH: RightBalance(T); *taller = FALSE; break; } } } } return OK; }
void main(){ //system("color 8f"); BSTree T,T1,T2,T3,T4; int input,search; int taller=0; int shorter=0; char a[30]; int x=0,y=0; T=T1=T2=T4=NULL; printf("**************************平衡二叉树****************************\n"); printf("*1.创建 2.显示二叉树 3.查找 4.插入 5.删除 6.合并两棵二叉树*\n"); printf("*7.分裂平衡二叉树 0.退出*\n"); printf("╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬\n"); while(1){ // system("cls"); printf("请输入您所需的操作功能:\t"); scanf("%d",&input);getchar(); switch(input) { case 1: { printf("输入关键字:"); //scanf("%s",a); gets(a); if(strlen(a)>0) { showCreatBST(T,a); printf("创建成功!\n"); //getch(); } else { printf("未输入任何字符!请重新选择操作!\n"); //getch(); } }break; case 2: paintAVL(T,NULL); break; case 3: printf("请输入你要查找的关键字:"); scanf("%c",&search); getchar(); if(SearchBST(T,search)){ printf("该二叉树中存在关键字%c,查找成功!\n",search);getch();paintAVL(T,search);} else printf("查找失败!\n"); break; case 4: printf("请输入你要插入的关键字:"); scanf("%c",&search); getchar(); InsertAVL(T,search,taller); paintAVL(T,search); break; case 5: printf("请输入你要删除的关键字:"); scanf("%c",&search); getchar(); DeleteAVL(T,search,shorter); paintAVL(T,NULL);break; case 6: printf("(6)请输入您所需的操作功能:\n"); printf("\t1.输入第一棵二叉树 2.输入第二棵二叉树 3.查看第一棵二叉树\n "); printf("\t4.查看第二棵二叉树 5.查看 6.合并二叉树\n\t0.返回上一级菜单\n"); while(true){ printf("\t请输入您所需的操作功能:\t"); scanf("%d",&input);getchar(); switch(input){ case 1:{ printf("\t请输入第一棵二叉树:\n"); CreatBST(T1); if(T1) printf("\t第一棵树创建成功!\n\n"); else printf("\t第一棵树创建失败\n");}break; case 2:{ printf("\t请输入第二棵二叉树:\n"); CreatBST(T2); if(T1) printf("\t第二棵树创建成功!\n\n"); else printf("\t第二棵树创建失败\n");}break; case 3:paintAVL(T1,NULL);break; case 4:paintAVL(T2,NULL);break; case 5:paint2AVL(T1,T2,NULL);break; case 6:CombineAVL(T1,T2);paintAVL(T1,NULL);break; case 0:break; default:printf("输入错误,");break; } if(input==0){input=9;break;} }break; case 7: char div; TElemType lower[30],higher[30]; printf("(7)请输入您所需的操作功能:\n"); printf("\t1.创建二叉树 2.查看二叉树 3.输入或更改分支点 4.开始分裂二叉树\n"); printf("\t5.查看分裂后的第一棵二叉树 6.查看分裂后的第二棵二叉树 7.查看\n\t0.返回上一级菜单\n"); while(true){ printf("\t请输入您所需的操作功能:\t"); scanf("%d",&input);getchar(); switch(input){ case 1:printf("\t创建二叉树\n");CreatBST(T);break; case 2:paintAVL(T,NULL);break; case 3:printf("\t请输入或更改分支点:");scanf("%c",&div);getchar();break; case 4: printf("\t开始分裂二叉树....\n"); for(x=0;x<30;x++){lower[x]='\0';higher[x]='\0';} x=0; devide(T,lower,higher,x,y,div); // for(int m=0;m<30;m++){lower[x]='\0';higher[x]='\0';} // for(x=0;higher[x];x++);higher[x]='\0'; //puts(lower); // puts(higher); getch(); CreatBST(T3,lower); CreatBST(T4,higher); break; case 5:paintAVL(T3,NULL);break; case 6:paintAVL(T4,NULL);break; case 7:paint2AVL(T3,T4,div);break; case 0:break; default:printf("输入错误,");break; } if(input==0){input=9;break;} } case 8: { printf("**************************平衡二叉树****************************\n"); printf("*1.创建 2.显示二叉树 3.查找 4.插入 5.删除 6.合并两棵二叉树*\n"); printf("*7.分裂平衡二叉树 0.退出*\n"); printf("╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬\n"); };break; case 0:break; default:printf("输入错误,");break; } if(input == 0) break; printf("按任意键继续...\n"); getch(); } printf("bye bye!\n"); getch(); }