Java数据结构与算法:红黑树
概要
概述:R-B Tree,又稱為“紅黑樹”。本文參考了《算法導論》中紅黑樹相關知識,加之自己的理解,然后以圖文的形式對紅黑樹進行說明。本文的主要內容包括:紅黑樹的特性,紅黑樹的時間復雜度和它的證明,紅黑樹的左旋、右旋、插入、刪除等操作。
R-B Tree簡介
平衡樹和非平衡樹
紅黑樹
R-B Tree,全稱是Red-Black Tree,又稱為“紅黑樹”,它一種特殊的二叉查找樹。紅黑樹的每個節點上都有存儲位表示節點的顏色,可以是紅(Red)或黑(Black)。
紅黑樹的特性:
(1)每個節點或者是黑色,或者是紅色。
(2)根節點是黑色。
(3)每個葉子節點(NIL)是黑色。 [注意:這里葉子節點,是指為空(NIL或NULL)的葉子節點!]
(4)如果一個節點是紅色的,則它的子節點必須是黑色的。
(5)從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點。
注意:
(01) 特性(3)中的葉子節點,是只為空(NIL或null)的節點。
(02) 特性(5),確保沒有一條路徑會比其他路徑長出倆倍。因而,紅黑樹是相對是接近平衡的二叉樹。
紅黑樹示意圖如下:
紅黑樹的應用
紅黑樹的應用比較廣泛,主要是用它來存儲有序的數據,它的時間復雜度是O(lgn),效率非常之高。
例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虛擬內存的管理,都是通過紅黑樹去實現的。
紅黑樹的時間復雜度和相關證明
紅黑樹的時間復雜度為: O(lgn)
下面通過“數學歸納法”對紅黑樹的時間復雜度進行證明。
定理:一棵含有n個節點的紅黑樹的高度至多為2log(n+1).
證明:
“一棵含有n個節點的紅黑樹的高度至多為2log(n+1)” 的逆否命題是 “高度為h的紅黑樹,它的包含的內節點個數至少為 2h/2-1個”。
我們只需要證明逆否命題,即可證明原命題為真;即只需證明 “高度為h的紅黑樹,它的包含的內節點個數至少為 2h/2-1個”。
從某個節點x出發(不包括該節點)到達一個葉節點的任意一條路徑上,黑色節點的個數稱為該節點的黑高度(x’s black height),記為bh(x)。關于bh(x)有兩點需要說明:
第1點:根據紅黑樹的”特性(5) ,即從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點”可知,從節點x出發到達的所有的葉節點具有相同數目的黑節點。這也就意味著,bh(x)的值是唯一的!
第2點:根據紅黑色的”特性(4),即如果一個節點是紅色的,則它的子節點必須是黑色的”可知,從節點x出發達到葉節點”所經歷的黑節點數目”>= “所經歷的紅節點的數目”。假設x是根節點,則可以得出結論”bh(x) >= h/2”。進而,我們只需證明 “高度為h的紅黑樹,它的包含的黑節點個數至少為 2bh(x)-1個”即可。
到這里,我們將需要證明的定理已經由
“一棵含有n個節點的紅黑樹的高度至多為2log(n+1)”
轉變成只需要證明
“高度為h的紅黑樹,它的包含的內節點個數至少為 2bh(x)-1個”。
下面通過”數學歸納法”開始論證高度為h的紅黑樹,它的包含的內節點個數至少為 2bh(x)-1個”。
(01) 當樹的高度h=0時,
內節點個數是0,bh(x) 為0,2bh(x)-1 也為 0。顯然,原命題成立。
(02) 當h>0,且樹的高度為 h-1 時,它包含的節點個數至少為 2bh(x)-1-1。這個是根據(01)推斷出來的!
下面,由樹的高度為 h-1 的已知條件推出“樹的高度為 h 時,它所包含的節點樹為 2bh(x)-1”。
當樹的高度為 h 時,
對于節點x(x為根節點),其黑高度為bh(x)
對于節點x的左右子樹,它們黑高度為 bh(x) 或者 bh(x)-1
根據(02)的已知條件,我們已知 “x的左右子樹,即高度為 h-1 的節點,它包含的節點至少為 2bh(x)-1-1 個”;
所以,節點x所包含的節點至少為 ( 2bh(x)-1-1 ) + ( 2bh(x)-1-1 ) + 1 = 2^bh(x)-1。即節點x所包含的節點至少為 2bh(x)-1。
因此,原命題成立
由(01)、(02)得出,”高度為h的紅黑樹,它的包含的內節點個數至少為 2^bh(x)-1個”
因此,“一棵含有n個節點的紅黑樹的高度至多為2log(n+1)”
紅黑樹的基本操作(一) 左旋和右旋
紅黑樹的基本操作是添加、刪除。在對紅黑樹進行添加或刪除之后,都會用到旋轉方法。為什么呢?道理很簡單,添加或刪除紅黑樹中的節點之后,紅黑樹就發生了變化,可能不滿足紅黑樹的5條性質,也就不再是一顆紅黑樹了,而是一顆普通的樹。而通過旋轉,可以使這顆樹重新成為紅黑樹。簡單點說,旋轉的目的是讓樹保持紅黑樹的特性。
旋轉包括兩種:左旋 和 右旋。下面分別對它們進行介紹。
總結
以上是生活随笔為你收集整理的Java数据结构与算法:红黑树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java数据结构和算法:数组、单链表、双
- 下一篇: Java数据结构和算法:哈夫曼树