数据结构 - 红黑树
數(shù)據(jù)結(jié)構(gòu) - 紅黑樹 - 面試常問知識點
數(shù)據(jù)結(jié)構(gòu)是面試中必定考查的知識點,面試者需要掌握幾種經(jīng)典的數(shù)據(jù)結(jié)構(gòu):線性表(數(shù)組、鏈表)、棧與隊列、樹(二叉樹、二叉查找樹、平衡二叉樹、紅黑樹)、圖。
本文主要介紹樹中的常見的紅黑樹數(shù)據(jù)結(jié)構(gòu)。包括
- 簡介
- 應(yīng)用
- 左旋和右旋
簡介
R-B Tree,全稱是Red-Black Tree,又稱為“紅黑樹”,它一種特殊的二叉查找樹。紅黑樹的每個節(jié)點上都有存儲位表示節(jié)點的顏色,可以是紅(Red)或黑(Black)。
紅黑樹的性質(zhì):
- (1). 每個節(jié)點或者是黑色,或者是紅色。
- (2). 根節(jié)點是黑色。
- (3). 每個葉子節(jié)點(NIL)是黑色。 [注意:這里葉子節(jié)點,是指為空(NIL或NULL)的葉子節(jié)點!]
- (4). 如果一個節(jié)點是紅色的,則它的子節(jié)點必須是黑色的。
- (5). 從一個節(jié)點到該節(jié)點的子孫節(jié)點的所有路徑上包含相同數(shù)目的黑節(jié)點。
- (6). 一棵含有n個節(jié)點的紅黑樹的高度至多為2log(n+1)。
- (7). 紅黑樹的時間復(fù)雜度為: O(logn)。
注意:
- 特性(3)中的葉子節(jié)點,是只為空(NIL或null)的節(jié)點。
- 特性(5)確保沒有一條路徑會比其他路徑長出倆倍。因而,紅黑樹是相對是接近平衡的二叉樹。
紅黑樹示意圖如下:
紅黑樹的引用
紅黑樹的應(yīng)用比較廣泛,主要是用它來存儲有序的數(shù)據(jù),它的時間復(fù)雜度是O(logn),效率非常之高。
例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虛擬內(nèi)存的管理,都是通過紅黑樹去實現(xiàn)的。
左旋和右旋
紅黑樹的基本操作是添加、刪除。在對紅黑樹進行添加或刪除之后,都會用到旋轉(zhuǎn)方法。為什么呢?
道理很簡單,添加或刪除紅黑樹中的節(jié)點之后,紅黑樹就發(fā)生了變化,可能不滿足紅黑樹的5條性質(zhì),也就不再是一顆紅黑樹了,而是一顆普通的樹。
而通過旋轉(zhuǎn),可以使這顆樹重新成為紅黑樹。簡單點說,旋轉(zhuǎn)的目的是讓樹保持紅黑樹的特性。
旋轉(zhuǎn)包括兩種:左旋 和 右旋。下面分別對它們進行介紹。
1. 左旋
對x進行左旋,意味著”將x變成一個左節(jié)點”。
2. 右旋
對Y進行右旋,意味著”將Y變成一個右節(jié)點”。
仔細觀察上面”左旋”和”右旋”的示意圖。我們能清晰的發(fā)現(xiàn),它們是對稱的。無論是左旋還是右旋,被旋轉(zhuǎn)的樹,在旋轉(zhuǎn)前是二叉查找樹,并且旋轉(zhuǎn)之后仍然是一顆二叉查找樹。
總結(jié)
以上是生活随笔為你收集整理的数据结构 - 红黑树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构 - 字符串 - 最长公共子序列
- 下一篇: Zookeeper API 学习与使用