AVL旋转图及其代码的实现

来源:互联网 发布:十大网络主播评选结果 编辑:程序博客网 时间:2024/06/16 09:18

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 = pPParent;        }        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;    }
原创粉丝点击