1. 程式人生 > >AVL樹,紅黑樹,B樹與B+樹

AVL樹,紅黑樹,B樹與B+樹

AVL樹

最先發明的自平衡二叉查詢樹,也被稱為高度平衡樹。相比於”二叉查詢樹”,它的特點是:AVL樹中任何節點的兩個子樹的高度最大差別為1。
AVL樹的查詢、插入和刪除在平均和最壞情況下都是O(logn)。

在AVL樹中進行插入或刪除節點後,可能導致AVL樹失去平衡。這種失去平衡的可以概括為4種姿態:LL(左左),LR(左右),RR(右右)和RL(右左)。下面給出它們的示意圖:
這裡寫圖片描述

LL:左子樹的左子樹導致的失衡,其餘依次類推。

LL的旋轉:

這裡寫圖片描述

RR的旋轉

這裡寫圖片描述

LR的旋轉

這裡寫圖片描述

RL的旋轉

這裡寫圖片描述

總結:發生問題的那個節點要成為根節點才能解決問題。不管我們是執行插入還是刪除操作,只要不滿足上面的條件,就要通過旋轉來保持平衡,而旋轉是非常耗時的,由此我們可以知道AVL樹適合用於插入刪除次數比較少,但查詢多的情況。

紅黑樹

紅黑樹只追求近似平衡,所以在插入與刪除節點時,翻轉次數遠遠少於平衡樹,因此在需要較多插入刪除操作的場景中,使用紅黑樹更好。同樣也因為近似平衡,所以在查詢時,紅黑樹查詢的深度可能會大於平衡二叉樹,所以在需要較多查詢的場景中,使用平衡二叉樹更好。

紅黑樹近似平衡:深度最大的節點的深度<= 2 * 深度最小的節點的深度。

先說這個顏色,晚上一大票博文都是上來就給你五條性質,為什麼要紅色黑色也不說下,根本看不懂!!!

為什麼要有顏色,因為要滿足近似平衡。

再來看五條性質:

性質1 . 節點是紅色或黑色。

性質2 . 根節點是黑色。

性質3 . 每個葉節點(NIL節點,空節點)是黑色的。

性質4 . 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)

性質5 . 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。

因為性質5,所以延伸除了近似平衡狀態,試想根節點到每個葉子節點的黑色節點個數相同,而每兩個紅色節點之間不能直接相連,根節點又必須為黑色,紅節點數小於黑節點數,所以推匯出:黑色節點個數<=每條路徑的總節點個數<=2倍的黑色節點數,所以最大深度與最小深度的最多相差一倍。

因為性質5,預設新插入的節點都為紅色,就算有顏色衝突,也可以通過變色和旋轉來修改樹。

注意:紅黑樹的查詢、刪除、新增操作都為log(n)。

插入操作:

1.將插入的節點著色為”紅色”。已滿足性質5

2.參考上面的性質,只可能不滿足性質4

3.根據被插入節點的父節點的情況,劃分為三種情況來處理。

① 情況說明:被插入的節點是根節點。
處理方法:直接把此節點塗為黑色。
② 情況說明:被插入的節點的父節點是黑色。
處理方法:什麼也不需要做。節點被插入後,仍然是紅黑樹。
③ 情況說明:被插入的節點的父節點是紅色。
處理方法:那麼,該情況與紅黑樹的“特性(4)”相沖突。這種情況下,被插入節點是一定存在非空祖父節點的;進一步的講,被插入節點也一定存在叔叔節點(當前節點的祖父節點的另一個子節點,空節點也算)。理解這點之後,我們依據”叔叔節點的情況”,將這種情況進一步劃分為3種情況(Case)。
這裡寫圖片描述

Case1 :

就是變色,把祖父節點變為紅色,父節點叔叔節點變為黑色,這樣在這幾個節點中不會不滿足性質。若此時,祖父節點是根節點,直接將祖父節點設為“黑色”,那就完全解決這個問題了;若祖父節點不是根節點,那我們需要將“祖父節點”設為“新的當前節點”,接著對“新的當前節點”進行分析。

這裡寫圖片描述

Case2:

這裡寫圖片描述

繼續把40作為當前節點,因為問題要從下層開始解決。

case3:

這裡寫圖片描述

把120當作當前節點

刪除,略過,直接看原文吧,這只是簡單介紹。

B樹,B+樹

B樹是一種查詢樹,我們知道,這一類樹(比如二叉查詢樹,紅黑樹等等)最初生成的目的都是為了解決某種系統中,查詢效率低的問題。B樹也是如此,它最初啟發於二叉查詢樹,二叉查詢樹的特點是每個非葉節點都只有兩個孩子節點。然而這種做法會導致當資料量非常大時,二叉查詢樹的深度過深,搜尋演算法自根節點向下搜尋時,需要訪問的節點也就變的相當多。如果這些節點儲存在外儲存器中,每訪問一個節點,相當於就是進行了一次I/O操作(因為每一層的節點都在一個磁碟上),隨著樹高度的增加,頻繁的I/O操作一定會降低查詢的效率。所以B樹就被搞出來降低樹的高度,從而減少磁碟的訪問。

  1. B樹的定義

最小度數為t的B樹滿足:
這裡寫圖片描述

一個標準的B樹如下圖:

這裡寫圖片描述

  1. B樹的高度

最小度數t,包含n個關鍵字的B樹的高度:
這裡寫圖片描述
在搜尋B樹時,很明顯,訪問節點(即讀取磁碟)的次數與樹的高度呈正比,而B樹與紅黑樹和普通的二叉查詢樹相比,雖然高度都是對數數量級,但是顯然B樹中log函式的底可以比2更大,因此,和二叉樹相比,極大地減少了磁碟讀取的次數。

B+樹看原文