1. 程式人生 > >終於搞懂了什麼是二叉查詢樹,AVL樹,B樹,B+樹,紅黑樹

終於搞懂了什麼是二叉查詢樹,AVL樹,B樹,B+樹,紅黑樹

二叉查詢樹:

二叉查詢樹就是左結點小於根節點,右結點大於根節點的一種排序樹,也叫二叉搜尋樹。也叫BST,英文Binary Sort Tree。

二叉查詢樹比普通樹查詢更快,查詢、插入、刪除的時間複雜度為O(logN)。但是二叉查詢樹有一種極端的情況,就是會變成一種線性連結串列似的結構。此時時間複雜度就變味了O(N),為了解決這種情況,出現了二叉平衡樹。

平衡二叉樹:

平衡二叉樹全稱平衡二叉搜尋樹,也叫AVL樹。是一種自平衡的樹。

AVL樹也規定了左結點小於根節點,右結點大於根節點。並且還規定了左子樹和右子樹的高度差不得超過1。這樣保證了它不會成為線性的連結串列。AVL樹的查詢穩定

,查詢、插入、刪除的時間複雜度都為O(logN),但是由於要維持自身的平衡,所以進行插入和刪除結點操作的時候,需要對結點進行頻繁的旋轉。

AVL樹每一個節點只能存放一個元素,並且每個節點只有兩個子節點。當進行查詢時,就需要多次磁碟IO(資料是存放在磁碟中的,每次查詢是將磁碟中的一頁資料加入記憶體,樹的每一層節點存放在一頁中,不同層資料存放在不同頁。)這樣如果需要多層查詢就需要多次磁碟IO。為了解決AVL樹的這個問題,就出現了B樹。

B樹:

B樹也叫平衡樹,也叫作B-樹,英文為Blance-Tree。是一種多路平衡樹。

一個m階的B樹規定了:

1.根結點至少有兩個子女。

2.每個中間節點都包含k-1個元素和k個孩子,其中 m/2 <= k <= m 。

3.每一個葉子節點都包含k-1個元素,其中 m/2 <= k <= m。

4.所有的葉子結點都位於同一層。

5.每個節點中的元素從小到大排列,節點當中k-1個元素正好是k個孩子包含的元素的值域分劃。

B樹每一層存放了更多的節點,由AVL樹的“瘦高”變成了“矮胖”。可以相對減少磁碟IO的次數。MongoDB的索引就是用B樹實現的。

B樹也是一種自平衡的樹,在進行插入和刪除操作時也需要對結點進行旋轉等操作。

不過,B樹的查詢不穩定,最好的情況就是在根節點查到了,最壞的情況就是在葉子結點查到。另外,B樹在遍歷方面比較麻煩,由於需要進行中序遍歷,所以也會進行一定數量的磁碟IO。為了解決這些問題,出現了B+樹。

B+樹:

B+樹每個非葉子結點存放的元素只用於索引作用,所有資料儲存在葉子結點。

一個m階的B+樹規定了:

1.有k個子樹的中間節點包含有k個元素(B樹中是k-1個元素),每個元素不儲存資料,只用來索引,所有資料都儲存在葉子節點。

2.所有的葉子結點中包含了全部元素的資訊,及指向含這些元素記錄的指標,且葉子結點本身依關鍵字的大小自小而大順序連結。

3.所有的中間節點元素都同時存在於子節點,在子節點元素中是最大(或最小)元素。

因為非葉子結點中存放的元素不存放資料,所以每一層可以容納更多元素,也就是磁碟中的每一頁可以存放更多元素。這樣在查詢時,磁碟IO的次數也會減少

另外,B+樹的查詢穩定,因為所有的資料都在葉子結點。每個葉子結點也通過指標指向構成了一種連結串列結構,所以遍歷資料也會簡單很多。

B+樹的插入和刪除和B樹類似。

紅黑樹:

紅黑樹也叫RB樹,RB-Tree。是一種自平衡的二叉查詢樹,它的節點的顏色為紅色和黑色。它不嚴格控制左、右子樹高度或節點數之差小於等於1。也是一種解決二叉查詢樹極端情況的資料結構。

紅黑樹規定了:

1.節點是紅色或黑色。

2.根節點是黑色。

3.每個葉子節點都是黑色的空節點(NIL節點)。

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

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

紅黑樹在查詢方面和AVL樹操作幾乎相同。但是在插入和刪除操作上,AVL樹每次插入刪除會進行大量的平衡度計算,紅黑樹是犧牲了嚴格的高度平衡的優越條件為代價,它只要求部分地達到平衡要求,結合變色,降低了對旋轉的要求,從而提高了效能。紅黑樹能夠以O(log2 n)的時間複雜度進行搜尋、插入、刪除操作。此外,由於它的設計,任何不平衡都會在三次旋轉之內解決。

相比於BST,因為紅黑樹可以能確保樹的最長路徑不大於兩倍的最短路徑的長度,所以可以看出它的查詢效果是有最低保證的。在最壞的情況下也可以保證O(logN)的,這是要好於二叉查詢樹的。因為二叉查詢樹最壞情況可以讓查詢達到O(N)。

紅黑樹的演算法時間複雜度和AVL相同,但統計效能比AVL樹更高,所以在插入和刪除中所做的後期維護操作肯定會比紅黑樹要耗時好多,但是他們的查詢效率都是O(logN),所以紅黑樹應用還是高於AVL樹的. 實際上插入 AVL 樹和紅黑樹的速度取決於你所插入的資料.如果你的資料分佈較好,則比較宜於採用 AVL樹(例如隨機產生系列數),但是如果你想處理比較雜亂的情況,則紅黑樹是比較快的。

紅黑樹廣泛用於TreeMap、TreeSet,以及jdk1.8後的HashMap。

學習文章:

B樹

B+樹

紅黑樹