TreeMap底層實(shí)現(xiàn)紅黑樹

紅黑樹:自平衡的排序二叉樹。
特性:它是一顆空樹或它的左右兩個(gè)子樹的高度差的絕對(duì)值不超過1悬荣,并且左右兩個(gè)子樹都是一棵平衡二叉樹骑冗。即對(duì)于其中任意一個(gè)子節(jié)點(diǎn),其左右子樹的高度都相近隆豹。

一棵有效的紅黑樹規(guī)則有5點(diǎn):
(1)每個(gè)節(jié)點(diǎn)都只能是紅色或者黑色
(2)根節(jié)點(diǎn)是黑色
(3)每個(gè)葉節(jié)點(diǎn)(NIL節(jié)點(diǎn)椭岩,空節(jié)點(diǎn))是黑色的
(4)如果一個(gè)結(jié)點(diǎn)是紅的,則它兩個(gè)子節(jié)點(diǎn)都是黑的璃赡。也就是說一條路徑上不能出現(xiàn)相鄰的兩個(gè)紅色結(jié)點(diǎn)
(5)從任一節(jié)點(diǎn)到其每個(gè)葉子的所有路徑都包含相同數(shù)目的黑色節(jié)點(diǎn)判哥。

紅黑樹主要三大操作:左旋、右旋碉考、著色塌计。
重點(diǎn)在于其節(jié)點(diǎn)的增刪時(shí)旋轉(zhuǎn)的選擇問題,這也是最大的難點(diǎn)侯谁。(需要多研究)

TreeMap繼承AbstractMap锌仅,實(shí)現(xiàn)NavigableMap、Cloneable墙贱、Serializable三個(gè)接口热芹。其中AbstractMap表明TreeMap為一個(gè)Map即支持key-value的集合,
NavigableMap則意外著其支持一系列的導(dǎo)航方法惨撇,具備針對(duì)給定搜索目標(biāo)返回最接近匹配項(xiàng)的導(dǎo)航方法伊脓。

TreeMap中幾個(gè)重要的屬性

//比較器,因?yàn)門reeMap是有序的串纺,通過comparator接口我們可以對(duì)TreeMap的內(nèi)部排序進(jìn)行精密的控制
        private final Comparator<? super K> comparator;
        //TreeMap紅-黑節(jié)點(diǎn)丽旅,為TreeMap的內(nèi)部類
        private transient Entry<K,V> root = null;
        //容器大小
        private transient int size = 0;
        //TreeMap修改次數(shù)
        private transient int modCount = 0;
        //紅黑樹的節(jié)點(diǎn)顏色--紅色
        private static final boolean RED = false;
        //紅黑樹的節(jié)點(diǎn)顏色--黑色
        private static final boolean BLACK = true;

鏈接:# Comparable和Comparator的區(qū)別
Comparable

Comparable可以認(rèn)為是一個(gè)內(nèi)比較器,實(shí)現(xiàn)了Comparable接口的類有一個(gè)特點(diǎn)纺棺,就是這些類是可以和自己比較的榄笙,至于具體和另一個(gè)實(shí)現(xiàn)了Comparable接口的類如何比較,則依賴compareTo方法的實(shí)現(xiàn)祷蝌,compareTo方法也被稱為自然比較方法茅撞。如果開發(fā)者add進(jìn)入一個(gè)Collection的對(duì)象想要Collections的sort方法幫你自動(dòng)進(jìn)行排序的話,那么這個(gè)對(duì)象必須實(shí)現(xiàn)Comparable接口。compareTo方法的返回值是int米丘,有三種情況:
1剑令、比較者大于被比較者(也就是compareTo方法里面的對(duì)象),那么返回正整數(shù)
2拄查、比較者等于被比較者吁津,那么返回0
3、比較者小于被比較者堕扶,那么返回負(fù)整數(shù)

Comparator
Comparator可以認(rèn)為是是一個(gè)外比較器碍脏,個(gè)人認(rèn)為有兩種情況可以使用實(shí)現(xiàn)Comparator接口的方式:
1、一個(gè)對(duì)象不支持自己和自己比較(沒有實(shí)現(xiàn)Comparable接口)稍算,但是又想對(duì)兩個(gè)對(duì)象進(jìn)行比較
2典尾、一個(gè)對(duì)象實(shí)現(xiàn)了Comparable接口,但是開發(fā)者認(rèn)為compareTo方法中的比較方式并不是自己想要的那種比較方式
Comparator接口里面有一個(gè)compare方法糊探,方法有兩個(gè)參數(shù)T o1和T o2钾埂,是泛型的表示方式,分別表示待比較的兩個(gè)對(duì)象科平,方法返回值和Comparable接口一樣是int褥紫,有三種情況:
1、o1大于o2匠抗,返回正整數(shù)
2故源、o1等于o2,返回0
3汞贸、o1小于o3绳军,返回負(fù)整數(shù)

對(duì)于葉子節(jié)點(diǎn)Entry是TreeMap的內(nèi)部類,它有幾個(gè)重要的屬性:

//鍵
        K key;
        //值
        V value;
        //左孩子
        Entry<K,V> left = null;
        //右孩子
        Entry<K,V> right = null;
        //父親
        Entry<K,V> parent;
        //顏色
        boolean color = BLACK;

紅黑樹插入新節(jié)點(diǎn)的三個(gè)關(guān)鍵地方:
1矢腻、插入新節(jié)點(diǎn)總是紅色節(jié)點(diǎn)门驾。
2、插入節(jié)點(diǎn)的父節(jié)點(diǎn)是黑色多柑,能維持性質(zhì)奶是。
3、如果插入節(jié)點(diǎn)的父節(jié)點(diǎn)是紅色竣灌,破壞了性質(zhì)聂沙。故插入算法就是通過重新著色或旋轉(zhuǎn),來維持性質(zhì)初嘹。

插入新節(jié)點(diǎn)的五種情況:
1及汉、新節(jié)點(diǎn)N為根節(jié)點(diǎn):
直接插入,將顏色設(shè)置為黑色屯烦。

2坷随、父節(jié)點(diǎn)P為黑色:
新節(jié)點(diǎn)N同樣直接插入房铭,同時(shí)顏色為紅色,由于根據(jù)規(guī)則四它會(huì)存在兩個(gè)黑色的葉子節(jié)點(diǎn)温眉,值為null缸匪。同時(shí)由于通過它的子節(jié)點(diǎn)的路徑依然會(huì)保存著相同的黑色節(jié)點(diǎn)數(shù),同樣滿足規(guī)則5.

1-2.png

3类溢、若父節(jié)點(diǎn)P和P的兄弟節(jié)點(diǎn)U都為紅色
對(duì)于這種情況若直接插入肯定出現(xiàn)不平衡現(xiàn)象凌蔬,如何處理?
P豌骏、U節(jié)點(diǎn)變黑龟梦、G節(jié)點(diǎn)變紅。這時(shí)由于經(jīng)過節(jié)點(diǎn)P窃躲、U的路徑都必須經(jīng)過G。所以在這些路徑上的黑色節(jié)點(diǎn)數(shù)目還是相同的钦睡。但是經(jīng)過上面的處理蒂窒,可能G節(jié)點(diǎn)的父節(jié)點(diǎn)也是紅色,這個(gè)時(shí)候需要將G節(jié)點(diǎn)當(dāng)做新增節(jié)點(diǎn)遞歸處理荞怒。


3.png

4洒琢、若父節(jié)點(diǎn)P為紅色,父節(jié)點(diǎn)兄弟節(jié)點(diǎn)U為黑色或者缺少褐桌,則新增節(jié)點(diǎn)N為P節(jié)點(diǎn)的右孩子
對(duì)于這種情況衰抑,對(duì)新增節(jié)點(diǎn)N、P進(jìn)行一次左旋轉(zhuǎn)荧嵌。這里所產(chǎn)生的結(jié)果其實(shí)并沒有完成呛踊,還是不平衡的(違反了規(guī)則四),這時(shí)我們需要進(jìn)行情況5的操作啦撮。


4.png

5谭网、父節(jié)點(diǎn)P為紅色,父節(jié)點(diǎn)兄弟節(jié)點(diǎn)U為黑色或者缺少赃春,則新增節(jié)點(diǎn)N為P節(jié)點(diǎn)的左孩子
這種情況可能由于情況四產(chǎn)生愉择,也有可能不是。對(duì)于這種情況织中,先以P為中心進(jìn)行右旋轉(zhuǎn)锥涕,在旋轉(zhuǎn)后產(chǎn)生的樹中,節(jié)點(diǎn)P是節(jié)點(diǎn)N狭吼、G的父節(jié)點(diǎn)层坠。但是這棵樹并不規(guī)范,它違反了規(guī)則4搏嗡,所以將P窿春、G節(jié)點(diǎn)的顏色進(jìn)行交換拉一,使之其滿足規(guī)范。開始時(shí)所有的路徑都需要經(jīng)過G,其它的黑色節(jié)點(diǎn)數(shù)一樣旧乞,但是現(xiàn)在所有的路徑改為經(jīng)過P蔚润,且P為整棵樹的唯一黑色節(jié)點(diǎn),所以調(diào)整后的樹同樣滿足規(guī)范5尺栖。


5.png

上面展示了紅黑樹新增節(jié)點(diǎn)的五種情況嫡纠,這五種情況覆蓋了所有的新增可能,不管這棵紅黑樹多么復(fù)雜延赌,都可以根據(jù)這五種情況進(jìn)行生成除盏。

來源:https://blog.csdn.net/chenssy/article/details/26668941
詳情看連接,博主寫的挺好

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挫以,一起剝皮案震驚了整個(gè)濱河市者蠕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掐松,老刑警劉巖踱侣,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異大磺,居然都是意外死亡抡句,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門杠愧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來待榔,“玉大人,你說我怎么就攤上這事流济∪衤啵” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵袭灯,是天一觀的道長(zhǎng)刺下。 經(jīng)常有香客問我,道長(zhǎng)稽荧,這世上最難降的妖魔是什么橘茉? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮姨丈,結(jié)果婚禮上畅卓,老公的妹妹穿的比我還像新娘。我一直安慰自己蟋恬,他們只是感情好翁潘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歼争,像睡著了一般拜马。 火紅的嫁衣襯著肌膚如雪渗勘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天俩莽,我揣著相機(jī)與錄音旺坠,去河邊找鬼。 笑死扮超,一個(gè)胖子當(dāng)著我的面吹牛取刃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播出刷,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼璧疗,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了馁龟?” 一聲冷哼從身側(cè)響起崩侠,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屁柏,沒想到半個(gè)月后啦膜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淌喻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雀摘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裸删。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖阵赠,靈堂內(nèi)的尸體忽然破棺而出涯塔,到底是詐尸還是另有隱情,我是刑警寧澤清蚀,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布匕荸,位于F島的核電站,受9級(jí)特大地震影響枷邪,放射性物質(zhì)發(fā)生泄漏榛搔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一东揣、第九天 我趴在偏房一處隱蔽的房頂上張望践惑。 院中可真熱鬧,春花似錦嘶卧、人聲如沸尔觉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)侦铜。三九已至专甩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钉稍,已是汗流浹背涤躲。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫁盲,地道東北人篓叶。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像羞秤,于是被迫代替她去往敵國(guó)和親缸托。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 從三月份找實(shí)習(xí)到現(xiàn)在瘾蛋,面了一些公司俐镐,掛了不少,但最終還是拿到小米哺哼、百度佩抹、阿里、京東取董、新浪棍苹、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,251評(píng)論 11 349
  • Java集合框架 Java平臺(tái)提供了一個(gè)全新的集合框架茵汰∈嗬铮“集合框架”主要由一組用來操作對(duì)象的接口組成。不同接口描述...
    小石38閱讀 360評(píng)論 0 0
  • 4 TreeMap 上一篇蹂午,介紹了集合框架中的HashMap對(duì)象栏豺,主要講述了HashMap的底層實(shí)現(xiàn)和基本操作。本...
    賈博巖閱讀 121,579評(píng)論 15 98
  • 一、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對(duì)于byte類型而言...
    龍貓小爺閱讀 4,265評(píng)論 0 16
  • 七絕 雪 整張素絹是誰(shuí)裁晚胡? 盤古未將天地開灵奖。 山野渾然成一色, 尋梅踏雪放歌來搬泥。
    老爸的雜拌兒糖閱讀 1,055評(píng)論 26 64