1. 程式人生 > >樹—紅黑樹基礎集合

樹—紅黑樹基礎集合

  紅黑樹是什麼?要說到紅黑樹,就不得不說二叉排序樹(Binary Sort Tree,又稱二叉查詢樹或二叉搜尋樹)。

 一、二叉排序樹(二叉查詢樹)

  二叉排序樹都滿足下列性質:


  (1)若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值;

  (2)若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值;

  (3)左、右子樹也分別為二叉排序樹;

    (4)  樹中每個節點被賦予了一個權值;                                      

  既然有這種樹,那一定有它的作用,二叉排序樹正如其名,可以用來排序,利用以上的三個性質,可以通過二分來快速查詢。

  舉個栗子:以上圖為例,假設要查詢值30的節點。

  1.從根節點開始檢視,30<50;

  2.利用性質查詢根結點的左孩子,30>20;

  3.查詢其右孩子,30=30,找到了所求的節點;

  聽起來很棒的樣子,查詢一個值變得更快,似乎時間複雜度並不高,最大查詢次數=樹的深度。可它有沒有不足的地方?

  當然有!!!

  please看下面的圖:

                   

  正所謂,凡事都有利弊,很明顯,二叉排序樹的查詢次數和它的深度息息相關,簡直是中毒太深。

  看了上圖作何感想?這張圖上的二叉樹好端端變成了近似一根線的樹,看起來怪怪的,這樣查詢並沒有達到預期效果,查詢一個數時,就只能一條路走到黑,這是二叉排序樹的一種很糟糕的情況(最壞遞迴到葉子節點,葉子節點最壞情況即為樹的深度),這是二叉樹的一種不平衡狀態,因此我們希望這棵樹能夠高度平衡,如何改變這種不平衡狀態?對二叉樹進行改進,使得動態操作下,每種種操作的最壞情況、期望或平攤的時間複雜度為O(logn),這樣的二叉查詢樹稱為平衡樹。此時,主角紅黑樹就派上用場了。

二、紅黑樹

  

紅黑樹的性質:

  1.節點是紅色或黑色。

  2.根節點是黑色。

  3.每個葉子節點都是黑色的空節點(NIL節點)。

  4 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)

  5.從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。

  看了以上性質應該都會認為紅黑比較繁瑣,但是這些性質約束了紅黑樹: 從根到葉子的最長的可能路徑不多於最短的可能路徑的兩倍長。所以是這個樹大致上是平衡的。因為操作比如插入、刪除和查詢某個值的最壞情況時間都要求與樹的高度成比例,這個在高度上的理論上限允許紅黑樹在最壞情況下都是高效的,而不同於普通的二叉查詢樹。

紅黑樹的操作:

  在紅黑樹上只讀操作不需要對用於二叉查詢樹的操作做出修改,因為它也是二叉查詢樹。但是,在插入和刪除之後,紅黑屬性可能變得違規。恢復紅黑屬性需要少量(O(log n))的顏色變更(這在實踐中是非常快速的)並且不超過三次樹旋轉(對於插入是兩次)。這允許插入和刪除保持為 O(log n) 次,但是它導致了非常複雜的操作。翻譯成人話來說就是紅黑樹操作時會變色。

  1)插入節點和刪除節點

  在討論紅黑樹的插入操作之前必須要明白,任何一個即將插入的新結點的初始顏色都為紅色。這一點很容易理解,因為插入黑點會增加某條路徑上黑結點的數目,從而導致整棵樹高度的不平衡。但如果新結點父結點為紅色時(如圖2所示),將會違返紅黑樹性質:一條路徑上不能出現相鄰的兩個紅色結點。這時就需要通過一系列操作來使紅黑樹保持平衡。

  //一張較全面的圖

  如何插入和刪除?小編最近看了一篇部落格,圖又多又好,推薦看一看,能力有限,不做過多解釋。(其實因為手太懶) https://blog.csdn.net/eric491179912/article/details/6179908 

  2)旋轉

  紅黑樹的旋轉操作和AVL樹一樣,分為LL、RR、LR、RL四種旋轉型別,差別在於旋轉完成後改變的是結點的顏色,而不是平衡因子。旋轉動畫演示請參考AVL這篇文章中的Flash動畫:推薦文章 http://www.cnblogs.com/abatei/archive/2008/11/17/1335031.html (轉);

  感謝看到末尾的同志們,你們的鼓勵將化作小編前進的動力!