紅黑樹和多叉樹介紹和理解

紅黑樹

  • 前言
    二叉搜索樹的一個缺點是不平衡,當插入的數是隨機數時效果很好,當插入的是有序的數時就和鏈表一樣了,沒有了插入和查詢都塊的特點了,這裏介紹一種改進保證了二叉搜索樹的平衡,當插入的是順序也好隨機也好都能保證二叉樹平衡,即紅-黑樹,只是在原來二叉樹的基礎上加了一下特定的條件契約讓樹可以一直保證平衡。(平衡樹兩個叉節點數差不多,不平衡樹一邊有節點多一邊有節點少),加入什麼特性使得二叉搜索樹能保持平衡呢?

  • 紅黑樹的規則
    1、每個節點不是紅就是黑
    2、根節點總是黑的,null空節點總是黑的
    3、如果節點是紅色的,那麼子節點必須是黑色的。(黑色的節點子節點不一定爲紅黑色的)
    4、從根到子葉節點或者空節點的每條路勁,必須包含相同數量的黑節點數目
    只要遵循這些規則就能保證樹是比較平衡的,那這些規則怎麼會保證平衡呢?怎麼理解呢?
    先看看背景
    先看看平衡樹的歷史,樹之所以不平衡是因爲高度又差,當一邊的高度低一邊的高度高時就是不平衡樹,查找的效率就降低,所以解決辦法就是想辦法讓樹保持高度一致,導致高度差的步驟即爲當插入時插入的位置不對比如下圖1,如果插入15則像圖2一樣,樹邊得不平衡了,說明某一個節點大了或者小了,如果某一個節點過大的話會導致插入的節點大部分或者全部都比它小就會全部進入左子樹,這樣子左子樹節點數比右子樹節點數多,就會使樹失去平衡左邊長右邊短和下圖一樣,若某節點過小則類比會使右子樹太高左子樹太矮失去平衡,比如下圖說名某節點數值過大了導致插入的節點往左子樹插入太多導致樹不平衡,這種情況出現的話想辦法調節一下過大節點的值即可使樹達到平衡,從插入後的樹進行調節,又不敢輕易調節太多不然失誤更大,所以從底部一步一步的調節,顯然30這個節點已經過大了,因爲過大所以才導致21插入時在左邊,而21又比15大所以才導致了15一直往左節點放才使樹不平衡,所以調節30這個節點值過大了,所以取一個比它小的節點來取代它的位置,多小呢要子節點的最小嘛不行這樣子所有子節點都會放右子樹又不平衡,所以取相鄰的一步一步來,這裏取21取代,那21的子樹怎麼安置呢,30又怎麼安置呢,30肯定往21的右子樹放,21的子樹左的仍然是左,右的插入右邊,這就是右旋轉的過程和來源,旋轉後發現左子樹變短了一節,但是右子樹又變長了,還是不平衡,說明45那個節點的值過大了導致插入的節點到左子樹過多了,再次對45節點進行同理調整即可平衡,旋轉不會超過兩次就能平衡(想象一下旋轉整個過程就明白),這就是旋轉解決不平衡的思路。從直觀角度來說旋轉就是使一些節點上升一些節點下降使得樹平衡
    簡言之,左邊太高說明節點過大,進行向右旋轉,右邊太高說明節點過小,進行向左旋轉
    在這裏插入圖片描述
    在這裏插入圖片描述
    知道怎麼調整不平衡樹了怎麼半段樹不平衡呢,我們畫出來很顯然,但是程序可不能看,前一個解決方案是,AVL樹,在節點再保存一個數據保存該節點左右子樹的高度差,當高度差超過1時就表示不平衡,則進行旋轉調整,這種方法容易理解而且查找也還有效率但是問題就是這個平衡的過程插入後不和就要旋轉,之後要向上掃描平衡,就是說插入後可能上面的節點的左右高度差就變了要向上檢查插入路徑上所有節點保證高度差的正確性。
    紅黑樹怎麼保證平衡呢,AVL方便容易想到但是插入效率低而且麻煩,還有沒有一種機制可以不用每次插入都要往上檢查就可以保證高度差不會太大以至於導致樹不平衡呢?,科學家們想到了一種巧妙交錯的辦法,就是黑白交錯,如果一棵樹上所有節點都只有兩種狀態黑白,並且黑白交錯,那麼如果所有路徑的黑節點數都相同那麼每個路徑相差不會超過一個,因爲黑白交錯,要麼紅的和黑的一樣要麼比黑的多一個節點,

  • 重複關鍵字的問題
    當有重複關鍵字時,只有將相同關鍵字一個放左邊一個放右邊才能使樹平衡,當具有相同關鍵字時需要特殊處理。

多叉樹

多叉樹就是含有多個數據項,而且除了葉子節點其他的必須含有比數據項多一個節點,每個節點的所有數據大小在對應數據項之間,這些規則都是爲了保證樹的平衡,如圖
在這裏插入圖片描述
當遇到滿節點時需要分裂,分裂的思路大致是,將滿節點的數據項中間值取出來然後分兩半,分出的來的兩邊組成兩個子樹,然後接在取出來的數據項的兩邊,如果是根節點分裂取出來的節點即爲新的根節點,如果不是根節點,取出來的數據項項加入父節點。也就是說除了葉子節點,其他節點都是從子節點分裂取出來的數據項慢慢填滿的。如圖
在這裏插入圖片描述

理解

和紅黑樹一樣的思路,紅黑樹樹判斷某一邊過大的思路是某一邊的黑節點數過多也就是太長了,說明相應的父節點過於大或者小,導致每次插入都一直往它的子節點放而不是放另外一邊,導致自己過長也就是樹不平衡。多叉樹也是一樣,當某一節點滿節點時,說明該節點的數據項分佈不合理導致會有數據一直插入該節點的子節點所以纔會滿節點,所以就取中間出來,讓它合理一些分佈。而且因爲多叉樹是往上加層的,也就是不會往下面增加層數,天然的平衡樹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章