二叉樹應該都不陌生,就像下面這副圖展現的這樣,是每一個結點最多有兩個子樹的樹結構算法
那麼二叉搜索樹就是以一顆二叉樹來組織,可是又須要知足以下特性:post
1.對於任何節點x,其左子樹的關鍵字<=x.key<=其右子樹的關鍵字
2.在新增和刪除關鍵字時也要知足如上特性
複製代碼
二叉搜索樹以下圖所示: spa
什麼是二叉搜索樹咱們知道了,可是設計
按照通常的有序查找,好比鏈表,查找時間應該是線性的,O(n);
那麼二叉搜索樹呢,其與樹的高度成正比,平均查找時間爲O(lgn);
複製代碼
因此咱們使用一顆搜索樹,可以很大程度上節約查找時間,尤爲是隨着關鍵字的增多,效果越顯著。3d
上面咱們說到二叉搜索樹,紅黑書實際上是它的變種,可是code
不得不說隨機二叉搜索樹的弊端,,好比: cdn
若是如圖中右側所示,關鍵字來的順序爲(8, 10,11,12,13,15....),那麼就會一直創建右側子樹,那麼對於這顆二叉搜索樹來講,其查找效率並無比單純的鏈表高,由於樹高很高。
若是是左側的構造方式,樹高能保持必定的平衡,來保證查找效率。blog
經常使用的有B樹、紅黑樹、AVL等get
AVL是嚴格的二叉平衡樹,平衡條件必須知足(全部節點的左右子樹高度差不超過1);
一旦不知足平衡,就須要進行調整
因爲維護這種高度平衡所付出的代價比從中得到的效率收益還大,故適用於插入刪除不頻繁,但查找要求較高的場合。
複製代碼
保證最壞的狀況下基本動態集合操做的時間複雜度爲O(lgn)
近似於平衡,要求沒有AVL嚴格
有以下特性:
1.每一個節點只能要麼是紅色的,要麼是黑色的
2.根節點和葉子節點是黑色的
3.若是一個節點是紅色的,則它的子節點必須都是黑色的
4.對每一個節點,從該節點到其全部後代葉節點的簡單路徑上,均包含相同數目的黑色節點。
5.更新刪除新增操做也必須保證如上特性
複製代碼
紅黑樹的應用很是普遍,好比C++的STL中,地圖和集都是用紅黑樹實現的。it
3.3 B樹
在《B樹一點都不神祕》一文中已經詳細介紹過B樹;
爲磁盤或者其餘直接存儲的輔助存儲設備設計
相似於紅黑樹,可是更下降磁盤操做I/O
節點分爲內部節點(非葉子節點)和葉子節點
節點能夠不止一個關鍵字
假設節點中的關鍵字個數爲n,則該節點的孩子數必定是n+1
.....
複製代碼
B樹與紅黑樹的不一樣之處在於B樹的節點能夠有不少孩子,從數個到數千個。因此B樹的分支能夠很是大; B樹的高度也是O(lgn),可是呢,B樹的嚴格高度要比紅黑書的高度要小不少,由於B樹能夠有很大的分支因子,將樹的高度拉低。
其餘相關章節
複製代碼
算法相關文章之一:《簡單說說二叉搜索樹》
算法相關文章之二:《B樹,一點都不神祕》
算法相關文章之三:《B樹很簡單,插入so easy》
算法相關文章之四:《什麼是動態規劃》