概述
關於樹的概念很多,B樹,B+樹,紅黑樹等等。
但是你去翻翻百度百科,或者用百度或者谷歌搜索一下中文的樹結構的介紹,全都是狗屁。沒有哪個中文網站是真正精確解釋樹的定義的,尤其是百度百科。
下面我要根據我自己的學習和理解。給出一些中文的定義。
什么是二叉樹(Binary Tree)
二叉樹是每個節點最多有兩個子節點的樹。
二叉樹的葉子節點有0個字節點,二叉樹的根節點或者內部節點有一個或者兩個字節點。
什么是二叉搜索樹(Binary Search Tree)
二叉查找樹又叫二叉搜索樹,
它或者是一棵空樹,或者是具有下列性質的二叉樹:
若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
它的左、右子樹也分別為二叉搜索樹。
一個印象比較深的二叉搜索樹就是問手機號。
假設你遇到一個美女想問他手機號,但是美女一般不告訴你數字。她只回答是否題。
那么你可以問她不超過14個問題就可以知道她手機號了。
假定手機號最大值是1000 0000 0000
是否大於500 0000 0000,開始分叉。
如果大於500 0000 0000,那么是否大於750 0000 0000。。。
如果小於500 0000 0000,那么是否大於250 0000 0000。。。
以此類推,這就是一個典型的二叉搜索樹。看起來很神奇,其實源自於一種巧妙的數學。
什么是平衡二叉樹(AVL Tree)
AVL樹全稱G.M. Adelson-Velsky和E.M. Landis,這是兩個人的人名。
AVL樹定義:
所有節點的左右子樹的高度差小於1的二叉樹。
如下圖
根節點左邊高度是3,因為左邊最多有3條邊;右邊高度而2,相差1.
根節點左邊的節點50的左邊是1條邊,高度為1,右邊有兩條邊,高度為2,相差1。
什么是B樹(B tree)
B樹也叫或B-樹、B_樹。
B樹英文官方定義:
1、Every node has at most m children.
2、Every non-leaf node (except root) has at least [m/2] child nodes.
3、The root has at least two children if it is not a leaf node.
4、A non-leaf node with k children contains k − 1 keys.
5、All leaves appear in the same level.
我理解的B樹定義:
1、根結點至少有兩個子節點;
2、每個非葉子節點並且非根節點最少有m/2個,即內部節點的字節點個數最少也有m/2個。
3、根節點最少有兩個字節點。
4、有k個關鍵字(關鍵字按遞增次序排列)的非葉結點恰好有k+1個孩子。
5、所有葉子節點在同一層,即所有葉子幾點高度一致。
如下圖(B樹的內部節點可以存放數據,類似ZK的中間節點一樣。B樹不是每個節點都有足夠多的子節點)
什么是B+樹(B+ tree)
B+樹是從B樹衍生而來。
跟B的不同:
1、B+樹非葉子節點不存放數據,只存放keys。
2、B+樹的葉子節點之間存在指針相連,而且是單鏈表
如下圖(其實B+樹上二叉搜索樹的擴展,二叉搜索樹是每次一分為二,B樹是每次一分為多)
現代操作系統中,磁盤的存儲結構使用的是B+樹機制,mysql的innodb引擎的存儲方式也是B+樹機制
數據結構參考資料
下面這個網站是一個介紹了很多數據結構的英文網站,可以參考下:
https://www.javatpoint.com/b-plus-tree