樹
1.二叉樹
==========================================================
二叉樹就是每個結點最多有兩個子樹的樹形存儲結構
*******二叉樹的遍歷*******
前序遍歷:根節點->左子樹->右子樹
中序遍歷:左子樹->根節點->右子樹
後序遍歷:左子樹->右子樹->根節點
注意:前、中、後是以根節點爲基準,也稱爲前根遍歷、中根遍歷、後根遍歷
例如:求下面樹的三種遍歷
前序遍歷:abdefgc
中序遍歷:debgfac
後序遍歷:edgfbca
*******二叉樹的存儲結構*******
順序和鏈式兩種方式
1>順序存儲結構
二叉樹的順序存儲,就是用一組連續的存儲單元存放二叉樹中的結點。因此,必須把二叉樹的所有結點安排成爲一個恰當的序列,
結點在這個序列中的相互位置能反映出結點之間的邏輯關係,用編號的方法從樹根起,自上層至下層,每層自左至右地給所有結點編號(層次遍歷);
缺點是有可能對存儲空間造成極大的浪費,在最壞的情況下,一個深度爲k且只有k個結點的右單支樹需要2k-1個結點存儲空間。
依據二叉樹的性質,完全二叉樹和滿二叉樹採用順序存儲比較合適;
1 2 3 4 5 6 7 0 0 0 0 80 0 0(0表示空,沒有子樹)
2>鏈式存儲結構
二叉樹的鏈式存儲結構是指,用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關係。
通常的方法是鏈表中每個結點由三個域組成,數據域和左右指針域,左右指針分別用來給出該結點左孩子和右孩子所在的鏈結點的存儲地址。其結點結構爲:
爲了方便訪問某結點的雙親,還可以給鏈表結點增加一個雙親字段parent,用來指向其雙親結點。每個結點由四個域組成,其結點結構爲:
2.完全二叉樹/滿二叉樹
==========================================================
滿二叉樹的定義是除了葉子結點,其它結點左右孩子都有,深度爲k的滿二叉樹,結點數就是2的k次方減1。
滿二叉樹一定是完全二叉樹,但是反過來就不一定。
3.平衡二叉樹
==========================================================
平衡二叉樹定義(AVL):它或者是一顆空樹,或者具有以下性質的二叉樹:
它的左子樹和右子樹的深度之差的絕對值不超過1,
且它的左子樹和右子樹都是一顆平衡二叉樹。
平衡因子(bf):結點的左子樹的深度減去右子樹的深度,那麼顯然-1<=bf<=1;
4 .B樹
==========================================================
即二叉搜索樹:
1.所有非葉子結點至多擁有兩個兒子(Left和Right);
2.所有結點存儲一個關鍵字;
3.非葉子結點的左指針指向小於其關鍵字的子樹,
右指針指向大於其關鍵字的子樹;
B樹的搜索,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中;否則,如果查詢關鍵字比結點關鍵字小,就進入左兒子;
如果比結點關鍵字大,就進入右兒子;如果左兒子或右兒子的指針爲空,則報告找不到相應的關鍵字;
如果B樹的所有非葉子結點的左右子樹的結點數目均保持差不多(平衡),那麼B樹的搜索性能逼近二分查找;
但它比連續內存空間的二分查找的優點是,改變B樹結構(插入與刪除結點)不需要移動大段的內存數據(它是鏈表方式存儲?),甚至通常是常數開銷;
時間複雜度:
給定值的比較次數等於給定值節點在二叉排序樹中的層數。
如果二叉排序樹是平衡的,則n個節點的二叉排序樹的高度爲Log2n+1,其查找效率爲O(Log2n),近似於折半查找。
如果二叉排序樹完全不平衡,則其深度可達到n,查找效率爲O(n),退化爲順序查找。
一般的,二叉排序樹的查找性能在O(Log2n)到O(n)之間。因此,爲了獲得較好的查找性能,就要構造一棵平衡的二叉排序樹。
5.B-樹
==========================================================
是一種多路搜索樹(並不是二叉的):
1.定義任意非葉子結點最多隻有M個兒子;且M>2;
2.根結點的兒子數爲[2, M];
3.除根結點以外的非葉子結點的兒子數爲[M/2, M];
4.每個結點存放至少M/2-1(取上整)和至多M-1個關鍵字;(至少2個關鍵字)
5.非葉子結點的關鍵字個數=指向兒子的指針個數-1;
6.非葉子結點的關鍵字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
7.非葉子結點的指針:P[1], P[2], …, P[M];其中P[1]指向關鍵字小於K[1]的子樹,P[M]指向關鍵字大於K[M-1]的子樹,其它P[i]指向關鍵字屬於(K[i-1],K[i])的子樹;
8.所有葉子結點位於同一層;
如:(M=3)
B-樹的搜索,從根結點開始,對結點內的關鍵字(有序)序列進行二分查找,如果命中則結束,否則進入查詢關鍵字所屬範圍的兒子結點;重複,直到所對應的兒子指針爲空,或已經是葉子結點;
B-樹的特性:
1.關鍵字集合分佈在整顆樹中;
2.任何一個關鍵字出現且只出現在一個結點中;
3.搜索有可能在非葉子結點結束;
4.其搜索性能等價於在關鍵字全集內做一次二分查找;
5.自動層次控制;
6.B+樹
==========================================================
B+樹是B-樹的變體,也是一種多路搜索樹:
1.其定義基本與B-樹同,除了:
2.非葉子結點的子樹指針與關鍵字個數相同;
3.非葉子結點的子樹指針P[i],指向關鍵字值屬於[K[i], K[i+1])的子樹(B-樹是開區間);
5.爲所有葉子結點增加一個鏈指針;
6.所有關鍵字都在葉子結點出現;
B+的搜索與B-樹也基本相同,區別是B+樹只有達到葉子結點才命中(B-樹可以在非葉子結點命中),其性能也等價於在關鍵字全集做一次二分查找;
B+的特性:
1.所有關鍵字都出現在葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字恰好是有序的;
2.不可能在非葉子結點命中;
3.非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是存儲(關鍵字)數據的數據層;
4.更適合文件索引系統;
TODO:
二叉樹的操作(遍歷、求高度等)Java實現、裂變問題(刪除、修改node時出現)等
參考:http://blog.csdn.net/winter13292/article/details/8572081