一、概念
R-B Tree,全稱是Red-Black Tree又稱紅黑樹,它是一種特殊的二叉查找樹,紅黑樹的每個節點上都有存儲位表示節點的顏色,可以是紅或黑。
二、特性
1、每個節點或者是紅色,或者是黑色
2、根節點是黑色的
3、每個葉子節點(NIL)是黑色的。注意:這里的葉子節點,是指為空的葉子節點
4、如果一個節點是紅色的,則它的子節點必須是黑色的
5、從任意一個節點到其葉子的所有路徑中,所包含的黑節點數量是相同的
特性解析1:根據特性4可知,從每個葉子節點到根節點的所有路徑中不能有兩個連續的紅節點
特性解析2:根據特性5可知,沒有一條路徑會比其它路徑長出兩倍,因而紅黑樹是接近平衡的二叉樹
三、應用
紅黑樹主要用於存儲有序的數據,它的時間復雜度是O(logn),非常高效
四、基本操作——插入
1、簡介
紅黑樹的基本操作是添加和刪除,在對紅黑樹進行添加和刪除之后,都會用到旋轉方法。為什么要用旋轉方法呢?因為添加或刪除紅黑樹的節點之后,紅黑樹就發生了變化,可能就不滿足紅黑樹的5條性質了,也就不是一顆紅黑樹了。而通過旋轉可以使這棵樹重新成為紅黑樹,即旋轉的目的就是為了保證紅黑樹的特性
左旋:對節點x進行左旋,意味着將“x的右孩子變成x的父親”,而將“x原先的右孩子的左孩子變成x的右孩子”。即左旋中的“左”是指將別旋轉的節點變成一個左節點
右旋:對節點x進行右旋,意味着將“x的左孩子變成x的父親,而將”x原先的左孩子的右孩子變成x的右孩子“。即右旋中的”右“是指將被旋轉的節點變成一個右節點
2、插入規則
新插入的節點都為紅色
3、紅黑樹插入的4種情形
(1)新節點位於根節點,其沒有父節點時,處理思路:將該節點直接設為黑色即可
(2)新節點的父節點已然是黑色時,處理思路:不用動,這已然是一顆紅黑樹
(3)父節點和叔節點都是紅色時,處理思路:a.將父節點和叔節點設為黑色;b.將祖父節點設為紅色;c.將祖父節點設為當前節點,並繼續對新當前節點進行操作
(4)父節點是紅色,叔節點是黑色時,又分如下四種情況:
- 當前節點是父親的左孩子,父親是祖父的左孩子(Left-Left),處理思路:a.將祖父節點右旋;b.交換父節點和祖父節點的顏色
- 當前節點是父親的右孩子,父親是祖父的左孩子(Right-Left),處理思路:a.將父節點左旋,並將父節點作為當前節點; b.然后再使用Left Left情形
- 當前節點是父親的右孩子,父親是祖父的右孩子(Right-Right),處理思路:a.將祖父節點左旋;b.交換父節點和祖父節點的顏色
- 當前節點是父親的左孩子,父親是祖父的右孩子(Left-Right),處理思路:a.將父節點右旋,並將父節點作為當前節點; b.然后再使用Right Right情形
4、插入圖例
通過插入12 1 9 2 0 11 7 19 4 15 18 5 14 13 10 16 6 3 8 17完成上述所有情形的展示。
(1)插入12
說明:插入的節點若是根節點,則直接將其設置為黑色
(2)插入1
說明:插入的節點若不是根節點,則將其設置為紅色
(3)插入9
(4)插入2
(5)插入0
(6)插入11
(7)插入7
(8)插入19
(9)插入4
(10)插入15
(11)插入18
(12)插入5
(13)插入14
(14)插入13
(15)插入10
(16)插入16
(17)插入6
(18)插入3
(19)插入8
(20)插入17
插入的過程講解完畢。
五、基本操作——刪除
1、紅黑樹刪除的情形
一、從樹中刪除節點X(以尋找后繼節點的方式進行刪除)
情況①:如果X沒有孩子,且如果X是紅色,直接刪除X;如果X是黑色,則以X為當前節點進行旋轉調色,最后刪掉X
情況②:如果X只有一個孩子C,交換X和C的數值,再對新X進行刪除。根據紅黑樹特性,此時X不可能為紅色,因為紅色節點要么沒有孩子,要么有兩個黑孩子。此時以新X為當前節點進行情況①的判斷
情況③:如果X有兩個孩子,則從后繼中找到最小節點D,交換X和D的數值,再對新X進行刪除。此時以新X為當前節點進行情況①或②的判斷
二、旋轉調色(N=旋轉調色的當前節點[等於情況①中的X],P=N的父親,W=N的兄弟,Nf=N的遠侄子,Nn=N的近侄子)
情況1:N是根或者N是紅色,則:直接將N設為黑色
情況2:N不是根且N是黑色,且W為紅色,則:將W設為黑色,P設為紅色,對P進行旋轉(N為P的左子時進行左旋,N為P的右子時進行右旋),將情況轉化為情況1、2、3、4、5
情況3:N不是根且N是黑色,且W為黑色,且W的左右子均為黑色,則:將W設為紅色,將P設為當前節點進行旋轉調色,將情況轉化為情況1、2、3、4、5
情況4:N不是根且N是黑色,且W為黑色,且Nf為黑色,Nn為紅色,則:交換W與Nn的顏色,並對W進行旋轉(N為P的左子進行右旋,N為P的右子進行左旋),旋轉后N的新兄弟W有一個紅色WR,則轉換為情況5
情況5:N不是根且N是黑色,且W為黑色,且Nf為紅色,Nn為黑色,則:將W設為P的顏色,P和Nf設為黑色,並對P進行旋轉(N為P的左子進行左旋,N為P的右子進行右旋),N設為根
2、插入圖例
通過刪除12 1 9 2 0 11 7 19 4 15 18 5 14 13 10 16 6 3 8 17完成上述所有情形的展示。
(1)刪除12
(2)刪除1
(3)刪除9
(4)刪除2
(5)刪除0
(6)刪除11
(7)刪除7
(8)刪除19
(9)刪除4
(10)刪除15
(11)刪除18
(12)刪除5
(13)刪除14
(14)刪除13
(15)刪除10
(16)刪除16
(17)刪除6
(18)刪除3
(19)刪除8
(20)刪除20
刪除完畢!