这个先贴一个之前写的博客,是关于左旋和右旋的AVL树的左旋和右旋这篇博客是对上一节的补充,在增加节点的时候,存在单旋和双旋,本篇文章主要介绍双旋
AVL树的双旋
双旋分为左右双旋和右左双旋
左右单旋:左右双旋先左单旋,再右单旋,即就是先顺时针旋转,后逆时针旋转
void RotateLR(Node* parent)
{
Node* subL = parent->_left;
Node* subLR = parent->_right;
//旋转之前保存subLR的平衡因子,旋转完成后,需要根据该平衡因子调整其他节点的平衡因子
int bf = subLR->_bf;
//先对30进行左单旋
RatateL(parent->_left)
//再对90进行右单旋
RatateR(parent);
if (bf == 1)
subL->_bf = -1;
else if (bf == -1)
parent->_bf = 1;
}
右左双旋:先将节点右单旋,再左单旋转,即就是先逆时针旋转,后顺时针旋转
void RotateRL(Node* parent)
{
Node* subR = parent->_right;
Node* subRL = parent->_left;
//旋转之前保存subLR的平衡因子,旋转完成后,需要根据该平衡因子调整其他节点的平衡因子
int bf = subRL->_bf;
//以90为中心进行右旋
RotateR(parent->_right);
//以30为中心进行左旋
RotateL(parent);
if (bf == 1)
{
subRL->_bf = 0;
parent->_bf = -1;
subR->_bf = 0;
}
else if(bf==-1)
{
subRL->_bf = 0;
parent->_bf = 0;
subR->_bf = 1;
}
else if (bf == 0)
{
subRL->_bf = 0;
parent->_bf = 0;
subR->_bf = 0;
}
}