[데이터 구조] 밸 런 스 이 진 트 리AVLTree
4188 단어 데이터 구조
#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100 /* */
typedef int Status; /* Status , , OK */
/* */
typedef struct BiTNode /* */
{
int data; /* */
int bf; /* */
struct BiTNode *lchild, *rchild; /* */
} BiTNode, *BiTree;
/* p , */
/* p , */
void R_Rotate(BiTree *P)
{
BiTree L;
L=(*P)->lchild; /* L P */
(*P)->lchild=L->rchild; /* L P */
L->rchild=(*P);
*P=L; /* P */
}
/* P , */
/* P , 0 */
void L_Rotate(BiTree *P)
{
BiTree R;
R=(*P)->rchild; /* R P */
(*P)->rchild=R->lchild; /* R P */
R->lchild=(*P);
*P=R; /* P */
}
#define LH +1 /* */
#define EH 0 /* */
#define RH -1 /* */
/* T */
/* , T */
void LeftBalance(BiTree *T)
{
BiTree L,Lr;
L=(*T)->lchild; /* L T */
switch(L->bf)
{ /* T , */
case LH: /* T , */
(*T)->bf=L->bf=EH;
R_Rotate(T);
break;
case RH: /* T , */
Lr=L->rchild; /* Lr T */
switch(Lr->bf)
{ /* T */
case LH: (*T)->bf=RH;
L->bf=EH;
break;
case EH: (*T)->bf=L->bf=EH;
break;
case RH: (*T)->bf=EH;
L->bf=LH;
break;
}
Lr->bf=EH;
L_Rotate(&(*T)->lchild); /* T */
R_Rotate(T); /* T */
}
}
/* T , */
/* , T */
void RightBalance(BiTree *T)
{
BiTree R,Rl;
R=(*T)->rchild; /* R T */
switch(R->bf)
{ /* T , */
case RH: /* T , */
(*T)->bf=R->bf=EH;
L_Rotate(T);
break;
case LH: /* T , */
Rl=R->lchild; /* Rl T */
switch(Rl->bf)
{ /* T */
case RH: (*T)->bf=LH;
R->bf=EH;
break;
case EH: (*T)->bf=R->bf=EH;
break;
case LH: (*T)->bf=EH;
R->bf=RH;
break;
}
Rl->bf=EH;
R_Rotate(&(*T)->rchild); /* T */
L_Rotate(T); /* T */
}
}
/* T e , */
/* e , 1, 0。 */
/* , , taller T 。 */
Status InsertAVL(BiTree *T,int e,Status *taller)
{
if(!*T)
{ /* , “ ”, taller TRUE */
*T=(BiTree)malloc(sizeof(BiTNode));
(*T)->data=e; (*T)->lchild=(*T)->rchild=NULL; (*T)->bf=EH;
*taller=TRUE;
}
else
{
if (e==(*T)->data)
{ /* e */
*taller=FALSE; return FALSE;
}
if (e<(*T)->data)
{ /* T */
if(!InsertAVL(&(*T)->lchild,e,taller)) /* */
return FALSE;
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;
}
}
else
{ /* T */
if(!InsertAVL(&(*T)->rchild,e,taller)) /* */
return FALSE;
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;
}
}
}
return TRUE;
}
int main(void)
{
int i;
int a[10]={3,2,1,4,5,6,7,10,9,8};
BiTree T=NULL;
Status taller;
for(i=0;i<10;i++)
{
InsertAVL(&T,a[i],&taller);
}
printf(" ");
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.