紅黑樹的特色 java
(1)每一個節點都是黑色,或者是紅色。linux
(2)根節點是黑色。blog
(3)每一個葉子節點(NIL)是黑色。【這裏的葉子節點指的是空(NIL/NULL)的葉子節點】內存
(4)若是一個節點是紅色的,則它的子節點必定是黑色的。內存管理
(5)從一個節點到這個節點的子孫節點的全部的路徑上有相同數目的黑色節點。class
注意:
(01) 特性(3)中的葉子節點,是隻爲空(NIL或null)的節點。
(02) 特性(5),確保沒有一條路徑會比其餘路徑長出倆倍。於是,紅黑樹是相對是接近平衡的二叉樹。效率
紅黑樹的應用原理
主要用來存儲有序的數據,它的時間複雜度是O(lgN),效率很是之高。如java中的TreeMap, TreeSet,C++ STL中的set map 以及二叉樹
linux的虛擬內存管理,都是經過紅黑樹來實現的。map
紅黑樹的基本操做(一)左旋和右旋
紅黑樹的基本操做中添加和刪除。在對紅黑樹進行添加和刪除後,都會用到旋轉的方法,由於添加和刪除會讓樹的結構發生變化,可能再也不知足紅黑樹的
性質。經過旋轉,咱們可使它又成爲一個紅黑樹。
基本定義
見代碼中的RBNode
旋轉總結
(1)左旋和右旋是相對的兩個概念,原理相似。
(2)下面是如何區分左旋和右旋。
區分左旋與右旋
仔細觀察上面"左旋"和"右旋"的示意圖。咱們能清晰的發現,它們是對稱的。不管是左旋仍是右旋,被旋轉的樹,在旋轉前是二叉查找樹,而且旋轉以後仍然是一顆二叉查找樹。
左旋示例圖(以x 爲節點)
z x / / \ --(左旋)--> x y z / y
對x 進行左旋,意味着將x 的右孩子 設爲x 的父親節點,也就是,將x 變成了一個左節點(x成了爲z的左孩子)。所以,左旋轉中的左,意味着被旋轉的節點將變成一個左節點。
右旋示例圖
y x \ / \ --(右旋)--> x y z \ z
對x進行右旋,意味着,將「x的左孩子」設爲「x的父親節點」;即,將 x變成了一個右節點(x成了爲y的右孩子)! 所以,右旋中的「右」,意味着「被旋轉的節點將變成一個右節點」。