紅黑樹(一)旋轉

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

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

  旋轉跟插入操作,我是跟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爲旋轉點,右旋。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章