簡介
樹結構是一種非線性存儲結構,存儲的是具有“一對多”關系的數據元素的集合。
二叉樹
定義
1.本身是有序樹;
2.樹中包含的各個節點的度不能超過 2,即只能是 0、1 或者 2;
例如,圖 1a) 就是一棵二叉樹,而圖 1b) 則不是。
特點
經過前人的總結,二叉樹具有以下幾個性質:
- 二叉樹中,第 i 層最多有 2i-1 個結點。
- 如果二叉樹的深度為 K,那么此二叉樹最多有 2K-1 個結點。
- 二叉樹中,終端結點數(葉子結點數)為 n0,度為 2 的結點數為 n2,則 n0=n2+1。
性質 3 的計算方法為:對於一個二叉樹來說,除了度為 0 的葉子結點和度為 2 的結點,剩下的就是度為 1 的結點(設為 n1),那么總結點 n=n0+n1+n2。
同時,對於每一個結點來說都是由其父結點分支表示的,假設樹中分枝數為 B,那么總結點數 n=B+1。而分枝數是可以通過 n1 和 n2 表示的,即 B=n1+2n2。所以,n 用另外一種方式表示為 n=n1+2n2+1。
兩種方式得到的 n 值組成一個方程組,就可以得出 n0=n2+1。
紅黑樹
定義
- 每個節點要么是黑色,要么是紅色;
- 根節點是黑色;
- 每個葉子節點(NIL)是黑色;
- 每個紅色結點的兩個子結點一定都是黑色;
- 任意一結點到每個葉子結點的路徑都包含數量相同的黑結點。
特點
紅黑樹並不是一個完美平衡二叉查找樹,從圖1可以看到,根結點P的左子樹顯然比右子樹高,但左子樹和右子樹的黑結點的層數是相等的,也即任意一個結點到到每個葉子結點的路徑都包含數量相同的黑結點(性質5)。所以我們叫紅黑樹這種平衡為黑色完美平衡。
- 紅黑樹參考
https://www.jianshu.com/p/e136ec79235c
B樹和B+樹
定義
是m叉的多路平衡查找樹。
- 從理論上講,二叉樹查找速度和比較次數都是最小的,為什么不用二叉樹呢?
因為我們要考慮磁盤IO的影響,它相對於內存來說是很慢的。數據庫索引是存儲在磁盤上的,當數據量大時,就不能把整個索引全部加載到內存了,只能逐一加載每一個磁盤頁(對應索引樹的節點)。所以我們要減少IO次數,對於樹來說,IO次數就是樹的高度,而“矮胖”就是b樹的特征之一,它的每個節點最多包含m個孩子,m稱為b樹的階,m的大小取決於磁盤頁的大小。
B樹(B-樹)特點
- 樹中每個結點至多有m棵子樹。(即至多含有m-1個關鍵字,兩顆子樹指針夾着一個關鍵字);
- 若根結點不是終端結點,則至少有兩顆子樹。(至少一個關鍵字);
- 除根結點外的所有非葉子結點至少有[m/2]棵子樹。(即至少含有[m/2]-1個關鍵字);
- 所有的葉子結點出現在同一個層次上,不帶信息。(就像是折半查找判斷樹中查找失敗的結點)。
- 每一個結點中的關鍵字滿足從左到右依次增大的規則。
B+樹
① 有n棵子樹的非葉子結點中含有n個關鍵字(b樹是n-1個),這些關鍵字不保存數據,只用來索引,所有數據都保存在葉子節點(b樹是每個關鍵字都保存數據)。
②:所有的葉子結點中包含了全部關鍵字的信息,及指向含這些關鍵字記錄的指針,且葉子結點本身依關鍵字的大小自小而大順序鏈接。
③: 所有的非葉子結點可以看成是索引部分,結點中僅含其子樹中的最大(或最小)關鍵字。
④:通常在b+樹上有兩個頭指針,一個指向根結點,一個指向關鍵字最小的葉子結點。
⑤:同一個數字會在不同節點中重復出現,根節點的最大元素就是b+樹的最大元素。
B+樹和B樹區別
①:在B+樹中,具有n個關鍵字的結點只含有n棵子樹,即每個關鍵字對應一顆子樹;而在B樹中,具有n個關鍵字的結點含有(n+1)棵子樹。
②:在B+樹中,每個結點(非根內部結點)關鍵字個數n的范圍是[m/2]<=n<=m(根結點1<=n<=m),在B樹中,每個結點(非根內部結點)關鍵字個數n的范圍是[m/2]-1<=n<=m-1(根結點:1<=n<=m-1)。
③: 在B+樹中,葉結點包含信息,所有非葉結點僅起到索引的作用,非葉結點中的每個索引項只含有對應子樹的最大關鍵字和指向該子樹的指針,不含有該關鍵字對應的存儲地址。
④:在B+樹中,葉結點包含了全部關鍵字,即在非葉結點中出現的關鍵字也會出現在葉結點中;而在B樹中,葉結點包含的關鍵字和其他結點包含的關鍵字是不重復的。
⑤:在B+樹中,有一個指針指向關鍵字最小的葉子結點,所有葉子結點連接成一個單鏈表。
B+樹和B樹最大區別
B樹內節點存儲data;B+樹內節點不存儲data,所有值都存儲在葉子節點中,這樣一個節點可以存儲更多的key,故mysql的InnoDB引擎使用的是B+樹。