搜索樹結點不同插入次序,將導致不同的深度和平均查找長度ASL:
什麼是平衡二叉樹
在介紹平衡二叉樹之前先要了解一個概念,“平衡因子”(Balance Factor,簡稱BF):,其中和分別爲的左、右子樹的高度。
平衡二叉樹(Balanced Binary Tree)(AVL樹)空樹,或者任一結點左、右子樹高度差的絕對值不超過1,即。
平衡二叉樹的高度能達到嗎?
設爲高度爲的平衡二叉樹的最少結點數。結點數最少時:
平衡二叉樹的調整
RR旋轉
由於其插入在右子樹的右邊,所以命名爲RR。
LL旋轉
LR旋轉
注意:有時候插入元素即便不需要調整結構,也可能需要重新計算一些平衡因子。
typedef struct AVLTreeNode * AVLTree;
typedef struct AVLTreeNode{
ElementType Data;
AVLTree Left;
AVLTree Right;
int Height;
};
AVLTree AVL Insertion ( ElementType x, AVLTree T)
{/*將X插入AVL樹T中,並且返回調整後的AVL樹*/
if(!T){/*若插入空樹,則新建包含一個結點的樹*/
T = (AVLTree)malloc(sizeof(struct AVLTreeNode));
T~>Data =X;
T->Height=0;
T->Left = T->Right = NULL:
}/* if[插入空樹)結束"*/
else if(X<T->Data){/*插入T的左子樹。*/
T->Left = AVL_Insertion(X, T->Lef);
if (GetHeight(T->Left)- GetHeigt(T->ight)==2)
/*"需要左旋*/
if (X< T->Left->Data)
T= singleLeftRotation(T); /*左單旋*/
else
T= DoubleLeftRightRotation(T);/*左右雙旋*/
}/* elseif(插入左子樹)結束"*/
else if(X> T->Data){/*插入T的右子樹*/
T->Right = AVL_Insertion(x, T->Right];
if (GetHeight(T->Left] - GetHeight(T->Right)==-2)
/*需要右旋*/
if (X> T->Right->Data)
T = SingeRightRotation(T); /”右單旋。/
else
T = DoubleRightLeftRotation(T);/*右左雙旋*/
}/* else if (插入右子樹)結束*/
/*elsex==T->Data,無須插入*/
T>Height = Max(GetHeight(T->Left),GetHeight(T->Righ))+1;
/*更新樹高*/
return T;
}
AVLTree SingleLeftRotation ( AVLTreeA )
{ /*注意: A必須有一個左子結點 B*/
/*將A與B做如圖4.35所示的左單旋,更新A與B的高度,返回新的根結點B */
AVLTree B= A->Left;
A->Left = B->Right;
B->Right = A;
A->Height = Max(GetHeight(A->Left), GetHeight(A->Right))+1;
B->Height = Max(GetHeight(B->Left), A->Height)+1; .
return B;
AVLTree DoubleLeftRightRotation ( AVLTree A)
{/*注意: A必須有一個左子結點B,且B必須有一個右子結點C */
/* 將A、B與C做如圖4.38所示的兩次單旋,返回新的根結點C*/
A->Left = SingleRightRotation(A->Left);/*將B與C做右單旋,C被返回*/
return SingleLeftRotation(A);/*將A與C做左單旋,C被返回*/
}