1、二叉查找樹(Binary Search Tree)BSThtml
即二叉搜索樹:node
B樹的搜索,從根結點開始,若是查詢的關鍵字與結點的關鍵字相等,那麼就命中;不然,若是查詢關鍵字比結點關鍵字小,就進入左兒子;若是比結點關鍵字大,就進入右兒子;若是左兒子或右兒子的指針爲空,則報告找不到相應的關鍵字;若是B樹的全部非葉子結點的左右子樹的結點數目均保持差很少(平衡),那麼B樹的搜索性能逼近二分查找;但它比連續內存空間的二分查找的優勢是,改變B樹結構。算法
右邊也是一個B樹,但它的搜索性能已是線性的了;一樣的關鍵字集合有可能致使不一樣的樹結構索引;因此,使用B樹還要考慮儘量讓B樹保持左圖的結構,和避免右圖的結構,也就是所謂的「平衡」問題;實際使用的B樹都是在原B樹的基礎上加上平衡算法,即「平衡二叉樹」;如何保持B樹結點分佈均勻的平衡算法是平衡二叉樹的關鍵;平衡算法是一種在B樹中插入和刪除結點的策略;性能
2、B樹.net
是一種多路搜索樹(並非二叉的):3d
B樹的搜索,從根結點開始,對結點內的關鍵字(有序)序列進行二分查找,若是命中則結束,不然進入查詢關鍵字所屬範圍的兒子結點;重複,直到所對應的兒子指針爲空,或已是葉子結點;指針
B樹的特性:htm
其最低搜索性能爲:blog
注:N爲關鍵字總數索引
B-樹的性能老是等價於二分查找(與M值無關),也就沒有B樹平衡的問題;
3、B+樹
B+樹是B-樹的變體,也是一種多路搜索樹:
B+的特性:
B+樹是B樹的一種變形,它把全部的衛星數據都存儲在葉節點中,內部節點只存放關鍵字和孩子指針,所以最大化了內部節點的分支因子,因此B+樹的遍歷也更加高效(B樹須要以中序的方式遍歷節點,而B+樹只需把全部葉子節點串成鏈表就能夠從頭至尾遍歷)。
圖中的指針是單向,實際上還有孩子節點指向父節點的指針,應該是雙向的。
B+樹的插入操做
4、B*樹
是B+樹的變體,在B+樹的非根和非葉子結點再增長指向兄弟的指針;
B*樹定義了非葉子結點關鍵字個數至少爲(2/3)*M,即塊的最低使用率爲2/3(代替B+樹的1/2);
B+樹的分裂:當一個結點滿時,分配一個新的結點,並將原結點中1/2的數據複製到新結點,最後在父結點中增長新結點的指針;B+樹的分裂隻影響原結點和父結點,而不會影響兄弟結點,因此它不須要指向兄弟的指針;
B*樹的分裂:當一個結點滿時,若是它的下一個兄弟結點未滿,那麼將一部分數據移到兄弟結點中,再在原結點插入關鍵字,最後修改父結點中兄弟結點的關鍵字(由於兄弟結點的關鍵字範圍改變了);若是兄弟也滿了,則在原結點與兄弟結點之間增長新結點,並各複製1/3的數據到新結點,最後在父結點增長新結點的指針;
因此,B*樹分配新結點的機率比B+樹要低,空間使用率更高;
小結
參考資料:
http://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.html
http://www.cnblogs.com/gaochundong/p/btree_and_bplustree.html#btree_node_relationship
http://www.jianshu.com/p/6f68d3c118d6
http://blog.jobbole.com/86594/
http://www.ruzuojun.com/topic/420.html
http://blog.csdn.net/v_JULY_v/article/details/6530142/