예제 #1
0
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
예제 #2
0
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;
}
예제 #3
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);
}
예제 #4
0
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;
}
예제 #5
0
파일: avl.c 프로젝트: luaohan/AVL
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();
  
}