1、概念spa
R-B Tree,全稱是Red-Black Tree又稱紅黑樹,它是一種特殊的二叉查找樹,紅黑樹的每一個節點上都有存儲位表示節點的顏色,能夠是紅或黑。3d
2、特性blog
一、每一個節點或者是紅色,或者是黑色二叉樹
二、根節點是黑色的方法
三、每一個葉子節點(NIL)是黑色的。注意:這裏的葉子節點,是指爲空的葉子節點im
四、若是一個節點是紅色的,則它的子節點必須是黑色的d3
五、從任意一個節點到其葉子的全部路徑中,所包含的黑節點數量是相同的數據
特性解析1:根據特性4可知,從每一個葉子節點到根節點的全部路徑中不能有兩個連續的紅節點db
特性解析2:根據特性5可知,沒有一條路徑會比其它路徑長出兩倍,於是紅黑樹是接近平衡的二叉樹img
3、應用
紅黑樹主要用於存儲有序的數據,它的時間複雜度是O(logn),很是高效
4、基本操做——插入
一、簡介
紅黑樹的基本操做是添加和刪除,在對紅黑樹進行添加和刪除以後,都會用到旋轉方法。爲何要用旋轉方法呢?由於添加或刪除紅黑樹的節點以後,紅黑樹就發生了變化,可能就不知足紅黑樹的5條性質了,也就不是一顆紅黑樹了。而經過旋轉能夠使這棵樹從新成爲紅黑樹,即旋轉的目的就是爲了保證紅黑樹的特性
左旋:對節點x進行左旋,意味着將「x的右孩子變成x的父親」,而將「x原先的右孩子的左孩子變成x的右孩子」。即左旋中的「左」是指將別旋轉的節點變成一個左節點
右旋:對節點x進行右旋,意味着將「x的左孩子變成x的父親,而將」x原先的左孩子的右孩子變成x的右孩子「。即右旋中的」右「是指將被旋轉的節點變成一個右節點
二、插入規則
新插入的節點都爲紅色
三、紅黑樹插入的4種情形
(1)新節點位於根節點,其沒有父節點時,處理思路:將該節點直接設爲黑色便可
(2)新節點的父節點已然是黑色時,處理思路:不用動,這已然是一顆紅黑樹
(3)父節點和叔節點都是紅色時,處理思路:a.將父節點和叔節點設爲黑色;b.將祖父節點設爲紅色;c.將祖父節點設爲當前節點,並繼續對新當前節點進行操做
(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
插入的過程講解完畢。
5、基本操做——刪除
一、紅黑樹刪除的情形
1、從樹中刪除節點X(以尋找後繼節點的方式進行刪除)
狀況①:若是X沒有孩子,且若是X是紅色,直接刪除X;若是X是黑色,則以X爲當前節點進行旋轉調色,最後刪掉X
狀況②:若是X只有一個孩子C,交換X和C的數值,再對新X進行刪除。根據紅黑樹特性,此時X不可能爲紅色,由於紅色節點要麼沒有孩子,要麼有兩個黑孩子。此時以新X爲當前節點進行狀況①的判斷
狀況③:若是X有兩個孩子,則從後繼中找到最小節點D,交換X和D的數值,再對新X進行刪除。此時以新X爲當前節點進行狀況①或②的判斷
2、旋轉調色(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設爲根
二、插入圖例
經過刪除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
刪除完畢!