當Kotlin遇見數據結構丨數據結構之樹結構概述(含滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜索樹、紅黑樹、B-樹、B+樹、B*樹)

1. 樹結構示意圖

補充:

  • 兄弟節點:具有相同父節點的節點互稱為兄弟節點。
  • 樹的深度:從根節點開始(其深度為0)自頂向下逐層累加的。上圖中,3的深度是1,6的深度是2,10的深度是3。
  • 節點高度:從葉子節點開始(其高度為0)自底向上逐層累加的。6的高度是1,根節點1的高度是3。

2. 二叉樹(Binary Tree)

  • 任何一個節點的子節點數量不超過2(子節點分為左節點與右節點)。
2.1 滿二叉樹(Full Binary Tree)
  • 所有葉子結點都在最后一層。
  • 節點的總數為2^n-1 (n為樹的高度)。
2.2 完全二叉樹(Complete Binary Tree)
  • 所有葉子結點都在最后一層或倒數第二層。
  • 最后一層的葉子結點在左邊連續,倒數第二節的葉子結點在右側連續。
2.3 平衡二叉樹(Balanced Binary Tree)
  • 也叫 AVL 樹。
  • 它是一顆空樹或左右兩個子樹的高度差的絕對值不超過1。
  • 左右兩個子樹均為平衡二叉樹。
2.4 二叉搜索樹(Binary Search Tree)
  • 也叫二叉查找樹、二叉排序樹。
  • 若子樹不空,則子樹上所有節點的值均小于或等于根節點的值。
  • 若右子樹不空,則右子樹所有節點的值均大于或等于根節點的值。
  • 左、右子樹也分別為二叉排序樹,或是一顆空樹。
2.5 紅黑樹(Red Black Tree)
  • 每個節點都帶有顏色屬性(顏色為紅或黑)的平衡二叉查找樹。
  • 節點是紅色或黑色。
  • 根節點是黑色。
  • 所有葉子結點都是黑色。
  • 每個紅色節點必須有兩個黑色的子節點(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)。
  • 從任一節點到其每個葉子的所有簡單路徑都包含相同數目的黑色節點。

3. B 樹

B-tree(多路搜索樹,并不是二叉的)是一種常見的數據結構。使用B-tree結構可以顯著減少定位記錄時所經歷的中間過程,從而加快存取速度。按照翻譯,B 通常認為是Balance的簡稱。這個數據結構一般用于數據庫的索引,綜合效率較高。

3.1 B- 樹

B-樹 就是指 B樹,也是一種用于查找的平衡樹,但是它不是二叉樹,B樹可以擁有多于2個子節點,能夠用來存儲排序后的數據。這種數據結構能夠讓查找數據、循序存取、插入數據及刪除的動作,都在對數時間內完成。這種數據結構常被應用在數據庫和文件系統的實作上。

  • 定義任意非葉子結點最多只有M個兒子;且M>2。

  • 根結點的兒子數為[2, M]。

  • 除根結點以外的非葉子結點的兒子數為[M/2, M]。

  • 每個結點存放至少M/2-1(取上整)和至多M-1個關鍵字;(至少2個關鍵字)。

  • 非葉子結點的關鍵字個數=指向兒子的指針個數-1。

  • 非葉子結點的關鍵字:K[1], K[2], …, K[M-1];且K[i] < K[i+1]。

  • 非葉子結點的指針:P[1], P[2], …, P[M];其中P[1]指向關鍵字小于K[1]的子樹,P[M]指向關鍵字大于K[M-1]的子樹,其它P[i]指向關鍵字屬于(K[i-1], K[i])的子樹。

  • 所有葉子結點位于同一層。

3.2 B+ 樹

B+樹 是 B樹 的變體,也是一種多路搜索樹

  • 其定義基本與B-樹相同,除了:

  • 非葉子結點的子樹指針與關鍵字個數相同。

  • 非葉子結點的子樹指針P[i],指向關鍵字值屬于[K[i], K[i+1])的子樹(B-樹是開區間)。

  • 為所有葉子結點增加一個鏈指針。

  • 所有關鍵字都在葉子結點出現。

特性:

  1. 所有關鍵字都出現在葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字恰好是有序的。

  2. 不可能在非葉子結點命中。

  3. 非葉子結點相當于是葉子結點的索引(稀疏索引),葉子結點相當于是存儲(關鍵字)數據的數據層。

  4. B+樹的分裂:當一個結點滿時,分配一個新的結點,并將原結點中1/2的數據復制到新結點,最后在父結點中增加新結點的指針;B+樹的分裂只影響原結點和父結點,而不會影響兄弟結點,所以它不需要指向兄弟的指針。

  5. 更適合文件索引系統。

3.3 B* 樹

是 B+樹 的變體,在 B+樹 的非根和非葉子結點再增加指向兄弟的指針

特性:

  1. B*樹定義了非葉子結點關鍵字個數至少為(2/3)M,即塊的最低使用率為2/3(代替B+樹的1/2)。

  2. B*樹的分裂:當一個結點滿時,如果它的下一個兄弟結點未滿,那么將一部分數據移到兄弟結點中,再在原結點插入關鍵字,最后修改父結點中兄弟結點的關鍵字(因為兄弟結點的關鍵字范圍改變了);如果兄弟也滿了,則在原結點與兄弟結點之間增加新結點,并各復制1/3的數據到新結點,最后在父結點增加新結點的指針。

所以,B*樹分配新結點的概率比B+樹要低,空間使用率更高。


本篇到此完結,如有補充內容隨時更新!歡迎關注本人繼續跟進技術干貨的更新!


推薦一款超好玩的微信小程序,無數俊男靚女為之瘋狂!(真的好玩!×3)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內容