平衡二叉树的定义
平衡二叉查找树( Balanced Binary Sort Tree,BBST)简称平衡二叉树。平衡二又树有很多种,其中最著名的是由前苏联数学家 Adele- Veliki和 Landis在1962年提出的高度平衡的二叉树。根据提出者的英文名字首字母简称为AVL树 。
平衡二叉树或者是棵空树,或者是具有下列性质的二叉查找树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的高度之差的绝对值不超过1。若将二叉树结点的平衡因子( Balance Factor)定义为该结点的左子树的高度减去它的右子树的高度,则所有结点的平衡因子只可能为-1、0、1。只要有一个结点的平衡因子的绝对值大于1,那么这棵树就失去了平衡。
平衡二叉树的存储结构及宏定义
#define LH +1 // 左子树比右子树高
#define EH 0 // 左、右子树等高
#define RH -1 // 右子树比左子树高
typedef int KeyType; // 关键字类型为整数类型
typedef struct {
KeyType key; // 关键字项
} RecordType, RcdType; // 记录类型
typedef struct BBSTNode {
RcdType data;
int bf; // 结点平衡因子
struct BBSTNode *lchild, *rchild; // 左右孩子
} * BBSTree; // 平衡二叉树
平衡二叉树的失衡及调整
最小失衡子树
在平衡二叉树中插入一个新结点后,从该结点起向上寻找第一个不平衡的结点(平衡因子bf变为了-2或2),以确定该树是否失衡。若找到,则以该结点为根的子树称为最小失衡子树。
平衡二叉树失衡后则需要调整,需要对失衡的情况进行分类,分为以下四种。
(1). LL型
LL型指的是在最小失衡子树的左孩子的左子树上插入了新的结点。失衡调整如下图所示,先找到最小失衡子树的根A,以其左孩子结点B为轴,对不平衡结点A进行顺时针旋转(也称为右旋)。右旋是让B顶替A的位置,并置A为B的右孩子,如果B存在右子树 BR B R ,则置