紅黑樹(一)旋轉


  紅黑樹屬於平衡二叉樹,所以很多操作根二叉樹是一樣的。學習紅黑樹,首先要把二叉樹理解,並能用代碼實現。

  我主要講述我是怎么寫一棵紅黑樹的,並不做過細的解釋。我們主要學習旋轉,插入,刪除。其他操作根二叉樹是一樣的。

  旋轉跟插入操作,我是跟STL源碼剖析學的,書上講的很清楚,一個上午就可以理解+實現,然后下午學習刪除操作,呵呵。。。刪除操作書中沒有介紹,我是對照算法導論里的偽代碼跟在網上找的代碼學的。不過有的博客里的源碼有錯誤,建議大家先把他的代碼粘下來,然后多運行兩便,確定沒問題后再跟他的代碼學習。

  接下來講旋轉操作,旋轉操作就是變換元素位置,已達到平衡的目的。

左旋操作,這個並不難,基本理解過程就可以寫出代碼,要注意的是,如果1是根節點,轉轉之后把7設成根節點。

//左旋
//1.將x的右孩子設為y的左孩子(如果y存在左孩子,將左孩子的父親設為x)
//2.將y的父親設為x的父親,將x的父親的孩子設為y(根據x的情況,考慮左右孩子,是否是根節點)
//3.將x的父親設為y,將y的左孩子設為x
static void left_rotate(Node * x, Tree * tree)
{
    Node * y;//y是x的右孩子

    y = x->right;
    x->right = y->left;
    if ( y->left != nil )
        y->left->parent = x;
    y->parent = x->parent;
    if ( tree->root != x )
    {
        if ( x == x->parent->left )
            x->parent->left = y;
        else
            x->parent->right = y;
    }
    else
        tree->root = y;
    y->left = x;
    x->parent = y;
}

大家可以根據自己的理解,實現代碼。注意,左旋,旋轉點一定要有左孩子。

右旋跟左旋操作一樣,將left與right對換。這里不做介紹。

還有一種操作叫雙旋,是通過左旋跟右旋來完成的。這里簡單介紹一下。

第一步,以5為旋轉點,左旋。

第二步,以10為旋轉點,右旋。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM