1. 程式人生 > 其它 >資料結構與演算法-二叉樹、AVL樹、B樹、紅黑樹總結

資料結構與演算法-二叉樹、AVL樹、B樹、紅黑樹總結

轉載:原文連結:https://blog.csdn.net/wanderlustLee/article/details/81297253

二叉查詢樹

二叉查詢樹就是左結點小於根節點,右結點大於根節點的一種排序樹,也叫二叉搜尋樹。也叫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。也是一種解決二叉查詢樹極端情況的資料結構。