紅黑樹屬於平衡二叉樹,所以很多操作根二叉樹是一樣的。學習紅黑樹,首先要把二叉樹理解,並能用代碼實現。
我主要講述我是怎么寫一棵紅黑樹的,並不做過細的解釋。我們主要學習旋轉,插入,刪除。其他操作根二叉樹是一樣的。
旋轉跟插入操作,我是跟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為旋轉點,右旋。