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。
根結點的兒子數為[2, M]。
除根結點以外的非葉子結點的兒子數為[M/2, M]。
每個結點存放至少M/2-1(取上整)和至多M-1個關鍵字;(至少2個關鍵字)。
非葉子結點的關鍵字個數=指向兒子的指針個數-1。
非葉子結點的關鍵字: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-樹是開區間)。
為所有葉子結點增加一個鏈指針。
所有關鍵字都在葉子結點出現。
特性:
所有關鍵字都出現在葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字恰好是有序的。
不可能在非葉子結點命中。
非葉子結點相當于是葉子結點的索引(稀疏索引),葉子結點相當于是存儲(關鍵字)數據的數據層。
B+樹的分裂:當一個結點滿時,分配一個新的結點,并將原結點中1/2的數據復制到新結點,最后在父結點中增加新結點的指針;B+樹的分裂只影響原結點和父結點,而不會影響兄弟結點,所以它不需要指向兄弟的指針。
更適合文件索引系統。
3.3 B* 樹
是 B+樹 的變體,在 B+樹 的非根和非葉子結點再增加指向兄弟的指針
特性:
B*樹定義了非葉子結點關鍵字個數至少為(2/3)M,即塊的最低使用率為2/3(代替B+樹的1/2)。
B*樹的分裂:當一個結點滿時,如果它的下一個兄弟結點未滿,那么將一部分數據移到兄弟結點中,再在原結點插入關鍵字,最后修改父結點中兄弟結點的關鍵字(因為兄弟結點的關鍵字范圍改變了);如果兄弟也滿了,則在原結點與兄弟結點之間增加新結點,并各復制1/3的數據到新結點,最后在父結點增加新結點的指針。
所以,B*樹分配新結點的概率比B+樹要低,空間使用率更高。
本篇到此完結,如有補充內容隨時更新!歡迎關注本人繼續跟進技術干貨的更新!
推薦一款超好玩的微信小程序,無數俊男靚女為之瘋狂!(真的好玩!×3)