查詢演算法(6)紅黑樹(RBT)
前言:
2-3樹雖然能實現平衡性,但在插入和刪除的過程中需要判斷插入的節點是2-節點還是3-節點等一系列問題,實現複雜且會增加額外的開銷,所以就提出了紅黑樹(發明者--Sedgewick,1987年)
一.基本概念
1. R-B Tree,全稱是Red-Black Tree,又稱為“紅黑樹”,它一種特殊的二叉查詢樹。紅黑樹的每個節點上都有儲存位表示節點的顏色,可以是紅(Red)或黑(Black)。2.紅黑樹的特性:
(1)每個節點或者是黑色,或者是紅色
(2)根節點是黑色
(3)葉子節點是黑色
(4)如果一個節點是紅色,則它的子節點必定為黑色,且父節點也必定為黑色
(5)從一個節點到該節點的子孫節點所有路徑包含相同數目的黑色節點(確保沒有一條路徑會比其它路徑長出兩倍)
3.調整平衡的方式?
(1)顏色變換
(2)旋轉
二.RBT插入調整
1.無需旋轉調整的情況
(1)插入的節點為根節點,將插入節點紅染黑,簡稱rootOver
(2)父節點為黑色,blackParentOver,簡稱bpOver
2.需要旋轉調整的情況,僅僅需要考慮父節點為紅色的情況(下面的父節點預設為爺爺節點的左孩子,右孩子情況相反)
(1)叔叔節點為紅色,插入節點可左可右;父叔節點染黑,爺節點染紅,插入節點回溯至爺節點
(2)叔叔節點為黑色,插入節點為右孩子;左旋父節點,插入節點指向父節點,轉化為(3)
(3)叔叔節點為黑色,插入節點為左孩子;父節點染黑,爺爺節點染紅,右旋爺節點
3.結論:RBT插入調整最多旋轉兩次
三.RBT刪除調整
1.刪除紅色節點,不會影響BH,也不會影響到性質4.無需調整,直接刪除
2.其它無需調整的情況為
(1)當前節點為根節點,無論root什麼顏色,直接染黑(rootOver)
(2)當前節點為紅色,將節點染黑,結束,redOver
2. 刪除左孩子,分為四種情況:
(1)兄弟節點為紅色,兄弟節點染黑,父節點染紅,左旋父節點
(2)兄弟節點為黑色,左右侄子都為黑色,兄弟節點染紅,X回溯至父節點
(3)兄弟節點為黑色,左侄紅,右侄黑,左侄染黑,右侄染紅,右旋兄弟
(4)兄弟節點為黑色,左侄隨意,兄弟變父節點顏色,兄弟父節點都染黑,左旋父節點
四.插入和刪除演示
1.插入
依次插入[12,1,9,2,0,11,7,19,4,15,18,5]
(1)插入12,插入1
(2)插入9
(3)插入2
(4)插入0
(5)插入11
(6)插入7
(7)插入19
(8)插入4
(9)插入15
(10)插入18
(11)插入5
2.刪除
佔坑...
三.性質分析
性質1:一棵大小為N的紅黑樹高度不會超過2logN
(最壞的情況是最左邊的節點全部是3-節點,而其餘為2-節點)
性質2:一棵大小為N的紅黑樹中,根節點到任意節點的平均長度為~1.00logN
(紅黑樹保證所有操作執行時間都是對數級別的)
四.紅黑樹相比AVL樹的優勢在哪?
紅黑樹的查詢效能略微遜色於AVL樹,因為他比avl樹會稍微不平衡最多一層,也就是說紅黑樹的查詢效能只比相同內容的avl樹最多多一次比較,但是,紅黑樹在插入和刪除上完爆avl樹,avl樹每次插入刪除會進行大量的平衡度計算,而紅黑樹為了維持紅黑性質所做的紅黑變換和旋轉的開銷,相較於avl樹為了維持平衡的開銷要小得多