AVL是一种自平衡的二叉搜索树,插入的过程中需要判断节点的平衡因子是否大于1,若大于一则需要调整,通常有四种旋转调整的方式(RR,LL,RL,LR),假设当前插入节点为M,平衡因子被破坏的节点为P,若M在P的左节点的左子树上便称为LL。以此类推。对于RR,需要向左旋转进行调整;对于LL需要向右旋转进行调整;LR则是先左旋再右旋;RL是先右旋再左旋。
代码模板如下:
struct AVL{
int val;
AVL* left;
AVL* right;
};
AVL* rotate_left(AVL* t)
{
AVL* tmp=t->right;
t->right=tmp->left;
tmp->left=t;
return tmp;
}
AVL* rotate_right(AVL* t)
{
AVL *tmp=t->left;
t->left=tmp->right;
tmp->right=t;
return tmp;
}
AVL* rotate_left_right(AVL* t)
{
t->left=rotate_left(t->left);
return rotate_right(t);
}
AVL* rotate_right_left(AVL* t)
{
t->right=rotate_right(t->right);
return rotate_left(t);
}