搜索树结点不同插入次序,将导致不同的深度和平均查找长度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被返回*/
}