Exemplo n.º 1
0
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;//正常删除
}
Exemplo n.º 2
0
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;


    }
}
Exemplo n.º 3
0
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);


}
Exemplo n.º 4
0
Arquivo: avl.c Projeto: luaohan/AVL
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;
    }
}
Exemplo n.º 5
0
Arquivo: avl.c Projeto: luaohan/AVL
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();
  
}