数据结构(三)平衡二叉树

  搜索树结点不同插入次序,将导致不同的深度和平均查找长度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被返回*/
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章