紅黑樹原理以及插入、刪除算法 附圖例說明


一、概念

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

刪除完畢!

參考:紅黑樹原理以及插入、刪除算法 附圖例說明


免責聲明!

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



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