性质
- 对于AVL树的任意节点来说,左子树和右子树的高度之差的绝对值不超过1
二叉平衡树
//二叉平衡树
struct node
{
int data, height;
node* left;
node* right;
};
生成一个新节点
//生成一个新节点
node* newNode(int data)
{
node* root = new node;
root->data = data;
root->left = root->right = NULL;
root->height = 1;
return root;
}
获取root的高度
//获取root的高度
int getHeight(node* root)
{
if (root == NULL)
return 0;
return root->height;
}
计算结点的平衡因子
//计算结点的平衡因子
int getBalance(node* root)
{
if (root != NULL)
return getHeight(root->left) - getHeight(root->right);
return 0;
}
更新高度
void updateHeight(node* root)
{
root->height = max(getHeight(root->left), getHeight(root->right)) + 1;
}
二叉平衡树的查找
//二叉平衡树的查找
void search(node* root,int v)
{
if (root == NULL)
{
//查找失败
printf("查找失败
");
return;
}
if (root->data == v)
{
//找到了
printf("查找成功
");
return;
}
else if (root->data > v)
{
//左边找
search(root->left, v);
}
else
{
//右边找
search(root->right, v);
}
}
左旋
//左旋
void L(node* &root)
{
//获得root的右孩子
node* r = root->right;
if (r != NULL)
{
//root的右孩子变为r的左孩子
root->right = r->left;
//r的左孩子变为root
r->left = root;
updateHeight(root);
updateHeight(r);
root = r;
}
}
右旋
//右旋
void R(node*& root)
{
//获得root的左孩子
node* l = root->left;
if (l != NULL)
{
//root的左孩子变为r的右孩子
root->left = l->right;
//r的左孩子变为root
l->right = root;
updateHeight(root);
updateHeight(l);
root =l;
}
}
插入
//插入
void insert(node*& root, int v)
{
if (root == NULL)
{
root = newNode(v);
return;
}
if (v < root->data)
{
//插在左边
insert(root->left, v);
updateHeight(root);
if (getBalance(root) == 2)
{
if (getBalance(root->left) == 1)//LL
{
//进行一次左旋
L(root);
}
else if (getBalance(root->left) == -1)//LR
{
//进行一次左旋
L(root->left);
//进行一次右旋
R(root);
}
}
}
else
{
//插在右边
insert(root->right, v);
updateHeight(root);
if (getBalance(root) == -2)
{
if (getBalance(root->right) == 1) //RL
{
//先右旋
R(root->right);
//再左旋
L(root);
}
else if (getBalance(root->right) == -1)//RR
{
R(root);
}
}
}
}
AVL的建立
//AVL的建立
node* Create(int data[],int n)
{
node* root = NULL;
for (int i = 0; i < n; i++)
{
insert(root, data[i]);
}
return root;
}