int DeleteAVL(BSTree &T,float key,bool &lower) { //0表示不存在该元素,1表示正常删除 if(!T) return 0; else if(key==T->data) { BSTree p,q = T; float temp; //存放T的左子树中的最大值,作为T的新数据 if(!T->rchild) //要删除没有右子树的结点,重接左子树,并删除结点(含叶子结点) { T = T->lchild; free(q); lower = true; } else if(!T->lchild) //要删除没有左子树的结点,重接右子树,并删除结点(含叶子结点) { T = T->rchild; free(q); lower = true; } else //左右子树都有,找*p左子树的最大值作为新的根结点,将p变为叶子结点删除 { p = T->lchild; while(p->rchild) { p = p->rchild; } temp = p->data; DeleteAVL(T,temp,lower); //temp的值一定存在,且为叶子结点 q->data = temp; } }//else_if else if(key<T->data) //在左子树中继续删除 { if(!DeleteAVL(T->lchild,key,lower)) return 0; if(lower&&--T->bf<=-2) { RightBalance(T); lower = false; }//if_lower 相当于T的右子树新插入一个结点引发的不平衡状态 }//else_if else //在右子树中继续删除 { if(!DeleteAVL(T->rchild,key,lower)) return 0; if(lower&&++T->bf>=2) { LeftBalance(T); lower = false; }//if_lower 相当于T的左子树新插入一个结点引发的不平衡状态 }//else return 1;//正常删除 }
int DeleteAVL(BST &T,int x,int &shorter) { int k; BST q; if(T==NULL) { printf("there is no tree"); return 0; } else if(x<T->data.key) { k=DeleteAVL(T->lchild,x,shorter); if(shorter==1) LeftBalance(T,shorter); return k; } else if(x>T->data.key) { k=DeleteAVL(T->rchild,x,shorter); if(shorter==1) { RightBalance(T,shorter); } return k; } else { q=T; if(T->rchild==NULL) { T=T->lchild; delete q; shorter=1; } else if(T->lchild==NULL) { T=T->rchild; delete q; shorter=1; } else { Delete(q,q->lchild,shorter); if(shorter==1) { LeftBalance(T,shorter); } T=q; } return 1; } }
int main() { printf("please in put the key\n"); BST F; F=new node; F=CreatBST(); Preorder(F); printf("which key do you want to search\n"); keytype k; scanf("%d",&k); BST temp; temp=new node; temp=searchBST(k,F); if(temp) { printf("serach successfully\n"); } printf("which key do you want to delete\n"); scanf("%d",&k); int shorter; DeleteAVL(F,k,shorter); Preorder(F); }
int DeleteAVL(BSTree *p,int x, int *shorter) { int k; BSTree q; if ((*p) == NULL) { printf("涓嶅瓨鍦ㄨ鍒犻櫎鐨勫叧閿瓧!!\n"); return 0; } else if ( x < (*p)->data ) { //鍦╬鐨勫乏瀛愭爲涓繘琛屽垹闄? k = DeleteAVL(&((*p)->lchild), x, shorter); if ( *shorter == 1){ LeftBalance_div(p, shorter); } return k; } else if ( x > (*p)->data ) { //鍦╬鐨勫彸瀛愭爲涓繘琛屽垹闄? k = DeleteAVL( &((*p)->rchild), x, shorter); if (*shorter == 1){ RightBalance_div(p, shorter); } return k; } else { q = *p; if ((*p)->rchild == NULL) //鍙冲瓙鏍戠┖鍒欏彧闇€閲嶆帴瀹冪殑宸﹀瓙鏍? { (*p) = (*p)->lchild; free(q); *shorter = 1; } else if ((*p)->lchild == NULL) { //宸﹀瓙鏍戠┖鍒欏彧闇€閲嶆帴瀹冪殑鍙冲瓙鏍? (*p) = (*p)->rchild; free(q); *shorter = 1; } else { //宸﹀彸瀛愭爲鍧囦笉绌? Delete(q, &(q->lchild), shorter); if (*shorter == 1){ LeftBalance_div(p, shorter); } (*p) = q; } return 1; } }
int DeleteAVL(BSTree *T, int key, int *shorter){ if (*T == NULL) {//No such key *shorter = FALSE; return 0; } else { if (key == (*T)->data) //鎵惧埌浜嗛渶瑕佸垹闄ょ殑缁撶偣 { //濡傛灉璇ョ粨鐐圭殑lchild 鍜? //rchild 鑷冲皯鏈変竴涓负NULL //鍒欏ぇ鍔熷憡鎴愶紝鍚﹀垯璇峰弬鐓? //涓嬫柟瑙i噴 BSTree q = *T; if ((*T)->lchild == NULL)//濡傛灉璇ョ粨鐐圭殑lchild 涓篘ULL { (*T) = (*T)->rchild; free(q); *shorter = TRUE; return 1; } else if ((*T)->rchild == NULL){//濡傛灉璇ョ粨鐐圭殑rchild 涓?NULL (*T) = (*T)->lchild;//濡傛灉涓嶆槸&锛堝紩鐢級鐨勫己澶у姛鑳斤紝杩欏彞璇濇槸娌℃湁鎰忎箟鐨? free(q); *shorter = TRUE; return 1; } else { //鍒犻櫎涓€涓乏鍙冲瀛愰兘涓嶄负绌虹殑缁撶偣 //浣胯缁撶偣鐨勭洿鎺ュ墠椹眕鐨刣ata鏇挎崲璇ョ粨鐐圭殑data //鐒跺悗鏀瑰彉key=p.data BSTree s = (*T)->lchild; while (s->rchild) s = s->rchild; (*T)->data = s->data; key = s->data;//Now, delete the vertice whose data was the new key } } if (key < (*T)->data){//杩欓噷涓嶪nsertAVL涓嶅悓 if (!DeleteAVL(&((*T)->lchild), key, shorter)) return 0; if (*shorter == TRUE){ switch((*T)->bf){ case LH:(*T)->bf = EH; *shorter = TRUE;break; case EH:(*T)->bf = RH; *shorter = FALSE;break; case RH:RightBalance(T); if ((*T)->rchild->bf == EH) *shorter = FALSE; else *shorter = TRUE;break; } } } else{ if (!DeleteAVL(&((*T)->rchild), key, shorter)) return 0; if (*shorter == TRUE){ switch((*T)->bf){ case LH:LeftBalance(T); if ((*T)->lchild->bf == EH) *shorter = FALSE; else *shorter = TRUE;break; case EH:(*T)->bf = LH; *shorter = FALSE;break; case RH:(*T)->bf = EH; *shorter = TRUE;break; } } } } return 1; }//Delete
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(); }