代码中所用到的结构体
typedef struct node
{
int key;//关键字
struct node*left;
struct node*right;
int height;//当前结点所在的高度
}BTNode;
构造平衡二叉树算法的主要思想
为了提高查找的效率,于是在二叉排序树的基础上,有了二叉平衡树的诞生。其中,先介绍几个重要的概念:
- 平衡因子(BF):任一结点的左子树的高度减去右子树的高度所得的高度差称为该结点的平衡因子BF
- AVL树:它的左子树和右子树都是AVL树; 且左子树和右子树的高度之差的绝对值不超过1。
重要性质:
- 一棵平衡二叉排序树如果有n个结点,其高度可保持在O(log2n),平均查找长度也可保持在O(log2n)
算法思想
- 通过递归的方法,来对二叉树进行构造,在BF值为正常值(即-1,0,1)的情况下,不对该二叉树进行特殊操作。
- 由于是使用递归的算法。故BF值得计算是从下往上计算,计算方法为当前结点的左儿子高度减去右儿子高度。
- 再通过插入关键值和BF值不正常结点的比较来决定进行哪种旋转
创建新结点
BTNode* newNode(int key)//初始化新的结点
{
BTNode *N = (BTNode*)malloc(sizeof(BTNode));
N->key = key;
N->left = NULL;
N->right = NULL;
N->height = 1;
return N;
}
当插入点在BF值异常点的左子树的左子树上
简称为左左插入,此时执行的是顺时针旋转
BTNode* LL_rotate(BTNode* y)//左左插入(顺旋转)
{
BTNode* x = y->left;//申请一个新的结构指针指向y的左结点
y->left = x->right;
x->right = y;
x->height = max(height(x->left),height(x->right));//对其高度进行更新
y->height = max(height(y->left),height(y->right));
return x;//返回根节点
}
当插入点在BF值异常点的右子树的右子树上
简称为右右插入,此时执行的是逆时针旋转
BTNode* RR_rotate(BTNode* y)//右右插入(逆旋转)
{
BTNode* x = y->right;
y->right = x->left;
x->left = y;
x->height = max(height(x->left),height(x->right));//对其高度进行更新
y->height = max(height(y->left),height(y->right));
return x;
}
当插入点在BF值异常点的左子树的右子树上
简称为左右插入,此时执行的是逆顺时针旋转,这个时候就调用一次逆旋转再调用一次顺旋转即可。
BTNode* LR_rotate(BTNode* y)//左右插入(逆顺旋转)
{
y->left = RR_rotate(y