一、AVL树简介
AVL树的名字来源于它的发明作者G.M. Adelson-Velsky 和 E.M. Landis。AVL树是最先发明的自平衡二叉查找树(Self-Balancing Binary Search Tree,简称平衡二叉树)。
平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。
平衡因子:将二叉树上某个节点的左子树高度减去右子树高度的值称为该节点的平衡因子BF(Balance Factor)。
二、ALV树的平衡调整
定义结构体:
typedef struct Node
{
int key;
struct Node* left;
struct Node* right;
int height;
}BTNode;
1 获取平衡因子
//节点的高度
int height(BTNode* N){
if (N == NULL)
return 0;
return N->height;
}
int getBF(BTNode* N){
if (N == NULL)
return 0;
return height(N->left) - height(N->right);
}
2 对不平衡子树进行调整
1)LL型
此时节点1不平衡(BF = 2-0 = 2 > 1)
把节点1作为实参,进行旋转,代码如下
BTNode* ll_rotate(BTNode* y){
BTNode* x = y->left;
y->left = x->right;
x->right = y;
y->height = max(height(y->left), height(y->right)) + 1;
x->height = max(height(x->left), height(x->right)) + 1;
return x;
}
2)RR型
此时节点-1不平衡(BF = 0-2 = -2 < -1)
把节点-1作为实参,进行旋转,代码如下
BTNode* rr_rotate(BTNode* y){
BTNode* x = y->right;
y->right = x->left;
x->left = y;
y->height = max(height(y->left), height(y->right)) + 1;
x->height = max(height(x->left), height(x->right)) + 1;
return x;
}
3)LR型
1的平衡因子 BF = 2-0 =2 > 1
先将1的左子树进行RR型旋转,再对1进行LL型旋转
4)RL型
1的平衡因子 BF = 0-2 =-2 < -1
先将1的右子树进行LL型旋转,再对1进行RR型旋转
三、删除节点操作
先删除节点,再进行平衡调整
//删除
BTNode* delNode(BTNode* root,</