平衡二叉樹(基本函式)
阿新 • • 發佈:2018-11-25
//注意 注意 注意 這裡邊的什麼什麼型的樹,都是我自己理解的,不是真的
左單旋
前期準備活動
typedfy struct AVLNode * Position;
typedfy Position AVLTree;
typedfy struct AVLNode{
ElementType Data;
AVLTree Left;
AVLTree Right;
int Height;
} ;
int Max(int a,int b){
return a>b?a:b;
}
左單旋
AVLTree SingleftRotation (AVLTree p){//左單旋
AVLTree x=p->Left;//A必須有一個左子樹節點B
p->Left=x->Right;
x->Right=p;
p->Height=Max(GetHeight(p->Left),GetHeight(p->Right))+1;//更新樹的高度
x->Height=Max(GetHeight(x->Left),p->Height)+1;
return x;
}
RL旋轉
AVLTree DoubleLeftRightRotation(AVLTree g){// g必須有一個左子樹p,p 必須要有一個右子樹x
//p和x做一次右RL單旋,把x返回
g->Left=SingleRightRotation(g->Left);
//將g和x做左單旋,x被返回
return SingLeftRotation(g);
}
這就是所謂的左單旋,和右單旋
平衡二叉樹的插入
AVLTree InSert(AVLTree T,ElementType X){
if(!T){//如果是空樹,直接插入
T=(AVLTree)malloc(sizeof(struct AVLNode));
T->Data=X;
T->Height=1;//先設好高度
T-> Left=T->Right=NULL;
}
else if(X<T->Data){//如果要插入左子樹
T->Left=TnSert(T->Left,X);//遞迴下去
if(GetHeight(T->Left)-GetHeight(T->Right)==2)//不平衡了
if(X<T->Left->Data)//LL型
T=SingleLeftRotation(T);
else//LR型
T=DoubleLeftRightRotation(T);
}
else if(X>T->Data){
T->Right=InSert(T-Right,X);
if(GetHeight(T->Left)-GetHeight(T->Right)==2)
if(X>T->Right->Data)//RR型
T=SingleRightRotation(T);
else//RL型
T=DoubleRightLeftRotation(T);
}
T->Height=Max(GetHeight(T->Left),GetHeight(T->Right))+1;//不要忘了還要更新樹的高度
return T;
}