樹
在計算機科學中,樹(英語:tree)是一種抽象數據類型或是實現這種抽象數據類型的數據結構,用來模擬具有樹狀結構性質的數據集合。它是由n(n>0)個有限節點組成一個具有層次關系的集合。把它叫做“樹”是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點:
①每個節點有零個或多個子節點;
②沒有父節點的節點稱為根節點;
③每一個非根節點有且只有一個父節點;
?④除了根節點外,每個子節點可以分為多個不相交的子樹;
關于樹的術語
根節點:沒有父節點的節點;
葉子節點:樹的末端,不含子節點的節點;
高度:對于任意節點n,n的高度為從n到一片樹葉的最長路徑長,所有樹葉的高度為0;
深度:對于任意節點n,n的深度為從根到n的唯一路徑長,根的深度為0。上圖中,根節點A的深度為0,D節點的深度為2;
二叉樹
每個節點最多含有兩個子節點的樹稱為二叉樹(大多數情況下我們遇到的樹都是二叉樹,但是不代表所有的樹都是二叉樹)
二叉樹的遍歷
前序遍歷:根結點 ---> 左子樹 ---> 右子樹
中序遍歷:左子樹--->?根結點?---> 右子樹
后序遍歷:左子樹 ---> 右子樹?---> 根結點
層次遍歷:從頂部到底部,從左邊到右邊
(前中后其實是針對于根節點的順序)
前序遍歷:1 ?2 ?4 ?5 ?7 ?8 ?3 ?6?
中序遍歷:4 ?2 ?7 ?5 ?8 ?1 ?3 ?6
后序遍歷:4 ?7 ?8 ?5 ?2 ?6 ?3 ?1
層次遍歷:1 ?2 ?3 ?4 ?5 ?6 ?7 ?8
滿二叉樹
一棵有n層的二叉樹,除第n層外,每層都有兩個子節點,那么這棵樹就是滿二叉樹。
換一種說法,除葉子節點外,每個節點都有兩個子節點。節點數達到最大值,所有葉子節點均在同一層。
完全二叉樹
完全二叉樹由滿二叉樹引進而來。假設二叉樹有h層,除第h層外,其他各層的節點數均已達到最大個數(1至h-1層為滿二叉樹),第h層所有的節點都集中在最左邊,這棵樹就是完全二叉樹。
二叉查找樹
又稱為二叉搜索樹、有序二叉樹、排序二叉樹
特性:
1.若任意節點的左子樹不空,則左子樹上所有節點的值均小于它的根節點的值;
2. 若任意節點的右子樹不空,則右子樹上所有節點的值均大于它的根節點的值;
3.任意節點的左、右子樹也分別為二叉查找樹;
4.沒有鍵值相等的節點。
二叉查找樹相比于其他數據結構的優勢在于查找、插入的時間復雜度較低為 O ( log ? n ) 。二叉查找樹是基礎性數據結構,用于構建更為抽象的數據結構,如集合、多重集、關聯數組等。
平衡二叉樹(AVL樹)
盡管二叉查找樹有較高的查詢性能,但是在某些情況下,二叉查找樹會退化成條鏈表,時間復雜度為O(n),效率降低,這時候我們需要用到平衡二叉樹。
平衡二叉樹特點:
1.平衡二叉樹要么是一棵空樹;
2.要么保證左右子樹的高度之差不大于 1;
3.子樹也必須是一顆平衡二叉樹;
紅黑樹
紅黑樹是一種自平衡的二叉查找樹,是一種高效的查找樹。
特點:
1.每個節點或者是黑色,或者是紅色。
2.根節點是黑色。
3.每個葉子節點(NIL)是黑色。?[注意:這里葉子節點,是指為空(NIL或NULL)的葉子節點!]
4.如果一個節點是紅色的,則它的子節點必須是黑色的。
5.從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點。
紅黑樹的應用比較廣泛,主要是用它來存儲有序的數據,它的時間復雜度是O(lgn),效率非常之高。
例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虛擬內存的管理,都是通過紅黑樹去實現的。
赫夫曼樹(最優二叉樹)
大家可能更多聽說的是哈夫曼編碼,其實就是哈夫曼樹的應用。
待續
B樹
B樹,Balance Tree,即為平
衡樹
一個m階的B樹具有如下幾個特征:
1.根結點至少有兩個子女。
2.每個中間節點都包含k-1個元素和k個孩子,其中 m/2 <= k <= m
3.每一個葉子節點都包含k-1個元素,其中 m/2 <= k <= m
4.所有的葉子結點都位于同一層。
5.每個節點中的元素從小到大排列,節點當中k-1個元素正好是k個孩子包含的元素的值域分劃。
B 樹中如何查找數據
B 樹的子樹大小排序規則,因此在 B 樹中查找數據時,一般需要這樣:
1.從根節點開始,如果查找的數據比根節點小,就去左子樹找,否則去右子樹
2.和子樹的多個關鍵字進行比較,找到它所處的范圍,然后去范圍對應的子樹中繼續查找
3.以此循環,直到找到或者到葉子節點還沒找到為止
B 樹的每個節點可以表示的信息更多,因此整個樹更加“矮胖”,這在從磁盤中查找數據(先讀取到內存、后查找)的過程中,可以減少磁盤 IO 的次數,從而提升查找速度。
B+樹
B+ 樹是對 B 樹的進一步優化。
B+ 樹和 B 樹不同之處:
1.B+ 樹非葉子節點上是不存儲數據的,僅存儲鍵值,而 B 樹節點中不僅存儲鍵值,也會存儲數據。
2.因為 B+ 樹索引的所有數據均存儲在葉子節點,而且數據是按照順序排列的。
B+是在在B樹基礎上,為葉子結點增加鏈表指針(B樹+葉子有序鏈表),所有關鍵字都在葉子結點 中出現,非葉子結點作為葉子結點的索引;B+樹總是到葉子結點才命中。
參考資料:
樹:https://blog.csdn.net/wannuoge4766/article/details/83998377
平衡二叉樹:https://zhuanlan.zhihu.com/p/56066942
維基百科中關于樹的解釋:https://zh.wikipedia.org/wiki/%E6%A0%91_(%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84)
紅黑樹:https://www.cnblogs.com/skywang12345/p/3245399.html
B樹:https://database.51cto.com/art/201911/605881.htm
參考書籍:
《數據結構與算法分析》
《數據結構(C語言版)/清華大學計算機系列教材》