數據結構之樹結構概述(含滿二叉樹、徹底二叉樹、平衡二叉樹、二叉搜索樹、紅黑樹、B-樹、B+樹、B*樹)

1. 樹結構示意圖

補充:數據庫

  • 兄弟節點:具備相同父節點的節點互稱爲兄弟節點。
  • 樹的深度:從根節點開始(其深度爲0)自頂向下逐層累加的。上圖中,3的深度是1,6的深度是2,10的深度是3。
  • 節點高度:從葉子節點開始(其高度爲0)自底向上逐層累加的。6的高度是1,根節點1的高度是3。

2. 二叉樹(Binary Tree)

  • 任何一個節點的子節點數量不超過2(子節點分爲左節點與右節點)。

2.1 滿二叉樹(Full Binary Tree)
  • 全部葉子結點都在最後一層
  • 節點的總數爲2^n-1 (n爲樹的高度)。

2.2 徹底二叉樹(Complete Binary Tree)
  • 全部葉子結點都在最後一層或倒數第二層。
  • 最後一層的葉子結點在左邊連續,倒數第二節的葉子結點在右側連續。

2.3 平衡二叉樹(Balanced Binary Tree)
  • 也叫 AVL 樹。
  • 它是一顆空樹或左右兩個子樹的高度差的絕對值不超過1。
  • 左右兩個子樹均爲平衡二叉樹。

2.4 二叉搜索樹(Binary Search Tree)
  • 也叫二叉查找樹、二叉排序樹。
  • 若子樹不空,則子樹上全部節點的值均小於或等於根節點的值。
  • 若右子樹不空,則右子樹全部節點的值均大於或等於根節點的值。
  • 左、右子樹也分別爲二叉排序樹,或是一顆空樹。

2.5 紅黑樹(Red Black Tree)
  • 每一個節點都帶有顏色屬性(顏色爲紅或黑)的平衡二叉查找樹。
  • 節點是紅色或黑色。
  • 根節點是黑色。
  • 全部葉子結點都是黑色。
  • 每一個紅色節點必須有兩個黑色的子節點(從每一個葉子到根的全部路徑上不能有兩個連續的紅色節點)。
  • 從任一節點到其每一個葉子的全部簡單路徑都包含相同數目的黑色節點。


3. B 樹

B-tree(多路搜索樹,並非二叉的)是一種常見的數據結構。使用B-tree結構能夠顯著減小定位記錄時所經歷的中間過程,從而加快存取速度。按照翻譯,B 一般認爲是Balance的簡稱。這個數據結構通常用於數據庫的索引,綜合效率較高。數據結構

3.1 B- 樹

B-樹 就是指 B樹,也是一種用於查找的平衡樹,可是它不是二叉樹,B樹能夠擁有多於2個子節點,可以用來存儲排序後的數據。這種數據結構可以讓查找數據、循序存取、插入數據及刪除的動做,都在對數時間內完成。這種數據結構常被應用在數據庫和文件系統的實做上。翻譯

  • 定義任意非葉子結點最多隻有M個兒子;且M>2。3d

  • 根結點的兒子數爲[2, M]。指針

  • 除根結點之外的非葉子結點的兒子數爲[M/2, M]。orm

  • 每一個結點存放至少M/2-1(取上整)和至多M-1個關鍵字;(至少2個關鍵字)。cdn

  • 非葉子結點的關鍵字個數=指向兒子的指針個數-1。blog

  • 非葉子結點的關鍵字:K[1], K[2], …, K[M-1];且K[i] < K[i+1]。排序

  • 非葉子結點的指針:P[1], P[2], …, P[M];其中P[1]指向關鍵字小於K[1]的子樹,P[M]指向關鍵字大於K[M-1]的子樹,其它P[i]指向關鍵字屬於(K[i-1], K[i])的子樹。索引

  • 全部葉子結點位於同一層。

3.2 B+ 樹

B+樹 是 B樹 的變體,也是一種多路搜索樹

  • 其定義基本與B-樹相同,除了:

  • 非葉子結點的子樹指針與關鍵字個數相同。

  • 非葉子結點的子樹指針P[i],指向關鍵字值屬於[K[i], K[i+1])的子樹(B-樹是開區間)。

  • 爲全部葉子結點增長一個鏈指針。

  • 全部關鍵字都在葉子結點出現。

特性:

  1. 全部關鍵字都出如今葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字剛好是有序的。

  2. 不可能在非葉子結點命中。

  3. 非葉子結點至關因而葉子結點的索引(稀疏索引),葉子結點至關因而存儲(關鍵字)數據的數據層。

  4. B+樹的分裂:當一個結點滿時,分配一個新的結點,並將原結點中1/2的數據複製到新結點,最後在父結點中增長新結點的指針;B+樹的分裂隻影響原結點和父結點,而不會影響兄弟結點,因此它不須要指向兄弟的指針。

  5. 更適合文件索引系統。

3.3 B* 樹

是 B+樹 的變體,在 B+樹 的非根和非葉子結點再增長指向兄弟的指針

特性:

  1. B**樹定義了非葉子結點關鍵字個數至少爲(2/3)*M,即塊的最低使用率爲2/3(代替B+樹的1/2)。

  2. B*樹的分裂:當一個結點滿時,若是它的下一個兄弟結點未滿,那麼將一部分數據移到兄弟結點中,再在原結點插入關鍵字,最後修改父結點中兄弟結點的關鍵字(由於兄弟結點的關鍵字範圍改變了);若是兄弟也滿了,則在原結點與兄弟結點之間增長新結點,並各複製1/3的數據到新結點,最後在父結點增長新結點的指針。

因此,B*樹分配新結點的機率比B+樹要低,空間使用率更高。


本篇到此完結,若有補充內容隨時更新!歡迎關注本人繼續跟進技術乾貨的更新!

相關文章
相關標籤/搜索