1. 程式人生 > >平衡二叉樹(基本函式)

平衡二叉樹(基本函式)

//注意 注意 注意 這裡邊的什麼什麼型的樹,都是我自己理解的,不是真的
左單旋
前期準備活動

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; }