數據結構(三)平衡二叉樹

  搜索樹結點不同插入次序,將導致不同的深度和平均查找長度ASL

不同樹的深度對比

什麼是平衡二叉樹

  在介紹平衡二叉樹之前先要了解一個概念,“平衡因子”(Balance Factor,簡稱BF):BF(T)=hLhRBF(T) = h_{L}-h_{R},其中hLh_{L}hRh_{R}分別爲TT的左、右子樹的高度。

  平衡二叉樹(Balanced Binary Tree)(AVL樹)空樹,或者任一結點左、右子樹高度差的絕對值不超過1,即BF(T)1|BF(T) |≤ 1

平衡二叉樹對比

平衡二叉樹的高度能達到log2nlog_{2}n嗎?

nhn_{h}爲高度爲hh的平衡二叉樹的最少結點數。結點數最少時:

平衡二叉樹結點數計算

平衡二叉樹的調整

RR旋轉

平衡二叉樹的調整:RR

  由於其插入在右子樹的右邊,所以命名爲RR。

LL旋轉

平衡二叉樹的調整:LL

LR旋轉

平衡二叉樹的調整: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被返回*/
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章