您的位置:首页 > 编程语言

[置顶] AVL旋转图及其代码的实现

2017-06-04 15:06 246 查看
1) 左单旋转

未插入前:



插入后:



旋转图:



旋转后:



下面是左单旋代码的实现:

void _Rotatel(Node* parent)  //左单旋
{
Node* pSubR=parent->_pright;
Node* pSubRL=pSubR->_pleft;
Node * pPParent=parent->_pParent;
parent->_pright=pSubRL;

if(pSubRL)
pSubRL->_pParent=parent;
pSubR->_pleft =parent;

parent->_pParent=pSubR;
pSubR->_pParent=pPParent;

if(NULL==pPParent)
{
_pRoot=pSubR ;
pSubR->_pParent = NULL;
}

else
{
if(pPParent->_pleft==parent)
pPParent->_pleft=pSubR;
else
pPParent->_pright=pSubR;
//pSubR->_pParent = p
4000
PParent;
}
parent ->_bf=pSubR->_bf==0;
//parent = pSubR;
}


2) 右单旋转

未插入前:



插入后:



旋转图:



旋转后:



下面是右单旋代码的实现:

void _RotateR(Node* parent)//右单旋
{
Node *pSubL = parent->_pleft;
Node *pSubLR = pSubL->_pright;
Node *ppParent = parent->_pParent;
parent->_pleft = pSubLR;
if (pSubLR)
pSubLR->_pParent = parent;
pSubL->_pright = parent;
parent->_pParent = pSubL;
if (NULL == ppParent)
{
_pRoot = pSubL;
pSubL->_pParent = NULL;
}
else
{
if (parent == ppParent->_pleft)
ppParent->_pleft = pSubL;
else
ppParent->_pright = pSubL;
pSubL->_pParent = ppParent;
}
pSubL->_bf = parent->_bf = 0;
parent = pSubL;
}


3) 先左后右双旋

未插入前:



插入后:



左旋转图:



左旋转后:



右旋转图:



右旋转后:



下面是先左后右双旋代码的实现:

void _RotateLR(Node* pParent)
{
Node *pSubL = pParent->_pleft;
Node *pSubLR = pSubL->_pright;

_Rotatel(pParent->_pleft);
_RotateR(pParent);
if (-1 == pSubLR->_bf)
pParent->_bf = 1;
else if (1 == pSubLR->_bf)
pSubL->_bf = -1;
}


4) 先右后左双旋转

未插入前:



插入后:



右旋转图:



右旋转后:



左旋转图:



左旋转后:



下面是先右后左双旋转代码的实现:

void _RotateRL(Node* pParent)
{
Node *pSubR = pParent->_pright;
Node *pSubRL = pSubR->_pleft;

_RotateR(pParent ->_pright);
_Rotatel(pParent);
if (1 ==  pSubRL->_bf)
pParent->_bf = -1;
else if (-1 ==  pSubRL->_bf)
pSubR->_bf = 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: