數據結構-樹系列之紅黑樹(五)

紅黑樹是樹的數據結構中最爲重要的一種。Java的容器TreeSet、TreeMap均使用紅黑樹實現。JDK1.8中HashMap中也加入了紅黑樹。C++ STL中的map和set同樣使用紅黑樹實現。之前的文章已經詳細介紹了2-3-4樹的性質與操作。本篇文章將從2-3-4樹與紅黑樹關係出發,詳細闡明紅黑樹。
  2-3-4樹和紅黑樹是完全等價的,但是2-3-4樹的編程實現相對複雜,所以一般是通過實現紅黑樹來實現替代2-3-4樹,而紅黑樹也同樣保證在O(logN)的時間內完成查找、插入和刪除操作。

定義

紅黑樹是每個節點都帶有顏色屬性的平衡二叉查找樹 ,顏色爲紅色或黑色。除了二叉查找樹一般要求以外,對於任何有效的紅黑樹我們增加了如下的額外要求:

(1)節點是要麼紅色或要麼是黑色
(2)根一定是黑色節點。
(3)每個葉子節點都帶有兩個空的黑色節點(稱之爲NIL節點,它又被稱爲哨兵)。
(4)每個紅色節點的兩個子節點都是黑色(或者說從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)。
(5)從任一節點到它所能到達得葉子節點的所有簡單路徑都包含相同數目的色節點。

典型的紅黑樹:
在這裏插入圖片描述

性質

根節點到任意葉子節點的路徑長度,最多相差一半。若樹存在最短路徑,則最短路徑上均爲黑色節點,那麼第五條性質保證根節點到達最長路徑與最短路徑所包含的黑色節點數目相同,若最短路徑長爲N,則最長路徑M=N+紅色節點數目,性質4要求紅色節點必定不連續,因此紅色節點數目最多爲N,則最長路徑與最短路徑最多相差N。

2-3-4樹和紅黑樹的等價關係

如果一棵樹滿足紅黑樹,把紅色節點收縮到其父節點,就變成了2-3-4樹,所有紅色節點都與其父節點構成3或4節點,其它節點爲2節點。一顆紅黑樹對應唯一形態的2-3-4樹,但是一顆2-3-4樹可以對應多種形態的紅黑樹(主要是3節點可以對應兩種不同的紅黑樹形態)。
在這裏插入圖片描述在這裏插入圖片描述

插入

插入節點的父節點爲黑色

若待插入節點的父節點爲黑色,則直接插入節點,並將插入的節點塗紅,插入結束。父節點爲黑色,插入紅色節點並不會使紅黑樹違背5條性質。
此種情形對應的在2-3-4樹中的插入操作爲:待插入位置的節點爲2-節點或者3-節點,直接插入節點。在這裏插入圖片描述插入節點的父節點爲紅色,叔叔節點爲黑色

若待插入節點的父節點爲紅色,叔叔節點爲黑色,此種情形又需要區分節點的插入位置,根據插入位置的不同進行相應的調整。此種情形共有四種:
  父節點P爲G左孩子,插入位置爲左孩子

若待插入節點C的父節點P是祖父節點G的左孩子,並且插入節點的位置位於父節點P的左孩子。調整過程如下:在這裏插入圖片描述右旋操作結束,將父節點P塗黑色,祖父節點G塗紅色,調整完畢。在這裏插入圖片描述父節點P爲G左孩子,插入位置爲右孩子

若待插入節點C的父節點P是祖父節點G的左孩子,並且插入節點的位置位於父節點P的右孩子。調整過程如下:在這裏插入圖片描述左旋操作結束後,仍然違背性質4,此時的情形符合6.2.1。在以節點G爲中心,執行右旋操作。右旋結束後,將節點C塗黑色,節點G塗紅色,調整完畢。
在這裏插入圖片描述父節點P爲G右孩子,插入位置爲右孩子

若待插入節點C的父節點P是祖父節點G的右孩子,並且插入節點的位置位於父節點P的右孩子。此種情形是6.2.1情形的鏡像。調整過程如下:在這裏插入圖片描述左旋操作結束,將父節點P塗黑色,祖父節點G塗紅色,調整完畢。在這裏插入圖片描述父節點P爲G右孩子,插入位置爲左孩子

若待插入節點C的父節點P是祖父節點G的右孩子,並且插入節點的位置位於父節點P的左孩子。此種情形是6.2.2的鏡像。調整過程如下:在這裏插入圖片描述右旋操作結束後,仍然違背性質4,此時的情形符合6.2.3。在以節點G爲中心,執行左旋操作。左旋結束後,將節點C塗黑色,節點G塗紅色,調整完畢。在這裏插入圖片描述插入節點的父節點爲紅色,叔叔節點爲紅色

若待插入節點C的父節點P爲紅色,且叔叔節點U爲紅色,則需要根據插入位置的不同,做出相應的調整。此種情形共有兩種:插入位置爲左子樹在這裏插入圖片描述插入位置爲右子樹在這裏插入圖片描述

刪除

刪除紅色葉子節點在這裏插入圖片描述刪除紅色節點,只有左子樹或只有右子樹在這裏插入圖片描述刪除紅色節點,既有左子樹又有右子樹

如果要刪除的節點不是葉子節點,用要刪除節點的後繼節點替換(只進行數據替換即可,顏色不變,此時也不需要調整結構),然後刪除後繼節點,後繼節點的刪除同樣要遵循紅黑樹的刪除過程。

刪除的黑色節點僅有左子樹或者僅有右子樹在這裏插入圖片描述在這裏插入圖片描述圖中填充爲綠色的節點代表既可以是紅色也可以是黑色,下同。

其餘的刪除還有很多種情況,一一羅列感覺意義不大,待我再研究研究,爭取用一張表格來歸納。(2019/6/4)

彩蛋

其實在《算法》第四版的書裏,介紹的是更簡易的紅黑樹,只允許左鏈接爲紅色節點,這樣的紅黑樹與什麼樹等價呢?
Yeah,與2-3樹是等價的。書中還有一個經典的圖片,即是把紅鏈接畫平,就完全變成了2-3樹。對於2-3-4樹的紅黑樹,也可以把紅鏈接畫平,相信你會瞬間理解兩者的等價關係。
在這裏插入圖片描述

本文部分參考:https://xiaozhuanlan.com/topic/5036471892 同學們可以移步去看一看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章