再學(xué) HashMap的紅黑樹

1: 手寫二分查找樹

// 二叉查找樹涂炎;
public class HelloWorld {
    public static void main(String[] args) {
      int[] x = new int[]{1,2,3,4,5,6,7,8,9,10,14,17,19};
      System.out.println(binarySearch(x,19));
    }
    public static int binarySearch(int[] arr,int num){
        int low = 0;
        int hight = arr.length - 1;
        while (low <= hight){
            int mid = low + (hight - low)/2;
            if (arr[mid] > num){
                hight = mid-1;
            } else if (arr[mid] < num)  {
                low = mid +1 ;
            }else{
                return mid;
            }
        } 
        return -1;
    }
}

//時(shí)間復(fù)雜度 o lg(n)
//空間復(fù)雜度 o(n)
注意二叉查找樹的問題喉悴,存在最壞的情況允乐,依賴數(shù)組的情況
AVL數(shù)畴椰,就是平衡樹瓣喊,各左右節(jié)點(diǎn)的高度差不超過1;能做到不偏向一方的情況

2: 紅黑樹的基本定義

五大特性

  • 每個節(jié)點(diǎn)要么是紅色的芽世,要么是黑色的
  • 根節(jié)點(diǎn)是黑色的
  • 每個葉子結(jié)點(diǎn)是NIL節(jié)點(diǎn)挚赊,且顏色為黑色
  • 每個紅色節(jié)點(diǎn)的子節(jié)點(diǎn)一定是黑色的,且不能兩個紅色的節(jié)點(diǎn)直接相連济瓢;
  • 任一節(jié)點(diǎn)到葉子結(jié)點(diǎn)荠割,都包含相同個數(shù)的黑色節(jié)點(diǎn)

常見操作

  • 變色 節(jié)點(diǎn)由黑變成紅,或者由紅變成黑
  • 左旋 以某個節(jié)點(diǎn)為支點(diǎn)(旋轉(zhuǎn)點(diǎn))旺矾,其右子節(jié)點(diǎn)變成旋轉(zhuǎn)節(jié)點(diǎn)的父節(jié)點(diǎn)蔑鹦;右子節(jié)點(diǎn)的變成旋轉(zhuǎn)節(jié)點(diǎn)的右子節(jié)點(diǎn),左子節(jié)點(diǎn)保持不變
  • 右旋 以某個節(jié)點(diǎn)為支點(diǎn)(旋轉(zhuǎn)點(diǎn))箕宙,其左子節(jié)點(diǎn)變成旋轉(zhuǎn)節(jié)點(diǎn)的父節(jié)點(diǎn)嚎朽,左子節(jié)點(diǎn)的右子節(jié)點(diǎn)變?yōu)樾D(zhuǎn)節(jié)點(diǎn)的左子節(jié)點(diǎn),右子節(jié)點(diǎn)保持不變
左旋
src=http___store.codemouse.online_pic_488618b8f9442efe97b25969b29262ac.gif&refer=http___store.codemouse.gif

圖片來源于網(wǎng)絡(luò)

右旋
src=http___images.cnitblog.com_blog_94031_201403_270025038901226.gif&refer=http___images.cnitblog.gif

圖片來源于網(wǎng)絡(luò)

紅黑樹的查找

類似于二分查找樹

紅黑樹的插入

插入節(jié)點(diǎn)必須是紅色柬帕,插入的情況可能會影響到樹的結(jié)構(gòu)哟忍;插入的情況一般分為一下的集中情況

  • 情景1: 紅黑樹為空樹
    直接插入狡门,將紅色節(jié)點(diǎn)更新為黑色

  • 情景2 : 插入的值為存在的值
    更新當(dāng)前節(jié)點(diǎn)的值,為插入節(jié)點(diǎn)的值

  • 情景3 : 插入節(jié)點(diǎn)的父節(jié)點(diǎn)為黑色的
    因?yàn)椴迦牍?jié)點(diǎn)是紅色锅很,當(dāng)插入節(jié)點(diǎn)的父節(jié)點(diǎn)是黑色的其馏,未破壞樹的平衡性

  • 情景4 :插入節(jié)點(diǎn)的父節(jié)點(diǎn)是紅色的,一定會破壞樹的平衡性爆安,需要對樹進(jìn)行調(diào)整叛复,分為多種情況(說明PP 為爺爺節(jié)點(diǎn),P為父節(jié)點(diǎn)扔仓,U為叔叔節(jié)點(diǎn))

    • 情景4.1 :叔叔節(jié)點(diǎn)存在褐奥,并且為紅節(jié)點(diǎn)
      該種情況,爺爺節(jié)點(diǎn)一定是黑色的当辐,此時(shí)的節(jié)點(diǎn)關(guān)系變成了黑紅紅抖僵,則需要進(jìn)行相應(yīng)的變化鲤看;

      將P和U節(jié)點(diǎn)改成黑色
      將PP節(jié)點(diǎn)改成紅色
      將PP節(jié)點(diǎn)設(shè)置為當(dāng)前節(jié)點(diǎn)缘揪,進(jìn)行下一步操作

    • 情景4.2 :叔叔節(jié)點(diǎn)不存在(或黑節(jié)點(diǎn)),并且插入節(jié)點(diǎn)的父親節(jié)點(diǎn)义桂,是祖父節(jié)點(diǎn)的左子樹找筝;
      • 情景4.2.1 :新插入的節(jié)點(diǎn)是父節(jié)點(diǎn)的左子樹(LL雙紅的情況)

      變顏色,將P節(jié)點(diǎn)變成黑色節(jié)點(diǎn)慷吊,PP變紅
      將PP節(jié)點(diǎn)進(jìn)行右旋

    • 情景4.2.2 :新插入的節(jié)點(diǎn)是父節(jié)點(diǎn)的右子樹(RL紅色的情況)

      對P進(jìn)行左旋
      將P設(shè)置為當(dāng)前節(jié)點(diǎn)
      按照LL雙紅的情況袖裕,對節(jié)點(diǎn)節(jié)點(diǎn)進(jìn)行修正(先將P節(jié)點(diǎn)變成黑色,然后進(jìn)行右旋)

  • 情景4.3 :叔叔節(jié)點(diǎn)不存在(或黑節(jié)點(diǎn))溉瓶,并且插入節(jié)點(diǎn)的父親節(jié)點(diǎn)急鳄,是祖父節(jié)點(diǎn)的右子樹;

    • 情景4.3.1 :新插入的節(jié)點(diǎn)是父節(jié)點(diǎn)的右子樹(R雙紅的情況)

    變顏色堰酿,將P節(jié)點(diǎn)變成黑色節(jié)點(diǎn)疾宏,PP變紅
    將PP節(jié)點(diǎn)進(jìn)行左旋

  • 情景4.3.2 :新插入的節(jié)點(diǎn)是父節(jié)點(diǎn)的右子樹(LR紅色的情況)

    將P進(jìn)行右旋
    將P設(shè)置為當(dāng)前節(jié)點(diǎn),變成了RR雙紅的情況
    將P變成黑色節(jié)點(diǎn)触创,PP變成紅色坎藐,將PP節(jié)點(diǎn)進(jìn)行左旋;

案例分析(todo List)

備注: 學(xué)習(xí)資料來源于B站

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哼绑,一起剝皮案震驚了整個濱河市岩馍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抖韩,老刑警劉巖蛀恩,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茂浮,居然都是意外死亡赦肋,警方通過查閱死者的電腦和手機(jī)块攒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佃乘,“玉大人囱井,你說我怎么就攤上這事∪け埽” “怎么了庞呕?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長程帕。 經(jīng)常有香客問我住练,道長,這世上最難降的妖魔是什么愁拭? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任讲逛,我火速辦了婚禮,結(jié)果婚禮上岭埠,老公的妹妹穿的比我還像新娘盏混。我一直安慰自己,他們只是感情好惜论,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布许赃。 她就那樣靜靜地躺著,像睡著了一般馆类。 火紅的嫁衣襯著肌膚如雪混聊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天乾巧,我揣著相機(jī)與錄音句喜,去河邊找鬼。 笑死沟于,一個胖子當(dāng)著我的面吹牛咳胃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播社裆,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拙绊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泳秀?” 一聲冷哼從身側(cè)響起标沪,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嗜傅,沒想到半個月后金句,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吕嘀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年违寞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贞瞒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡趁曼,死狀恐怖军浆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挡闰,我是刑警寧澤乒融,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站摄悯,受9級特大地震影響赞季,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奢驯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一申钩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瘪阁,春花似錦撒遣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钢猛。三九已至伙菜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間命迈,已是汗流浹背贩绕。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留壶愤,地道東北人淑倾。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像征椒,于是被迫代替她去往敵國和親娇哆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353