常用數據結構——樹

樹(Tree)的基本概念
樹是由結點或頂點和邊組成的(可能是非線性的)且不存在著任何環(huán)的一種數據結構娩梨。沒有結點的樹稱為空(null或empty)樹丹擎。一棵非空的樹包括一個根結點糖儡,還(很可能)有多個附加結點斗躏,所有結點構成一個多級分層結構柱告。

二叉樹

每個結點至多擁有兩棵子樹(即二叉樹中不存在度大于2的結點)馏鹤,并且征椒,二叉樹的子樹有左右之分,其次序不能任意顛倒湃累。
二叉樹的性質
1.若二叉樹的層次從0開始勃救,則在二叉樹的第i層至多有2^i個結點(i>=0)
2.高度為k的二叉樹最多有2^(k+1) - 1個結點(k>=-1)(空樹的高度為-1)
3.對任何一棵二叉樹,如果其葉子結點(度為0)數為m, 度為2的結點數為n, 則m = n + 1

二叉樹又分為:完美二叉樹治力,完全二叉樹蒙秒,完滿二叉樹
完美二叉樹(滿二叉樹)

image

完全二叉樹

image

完滿二叉樹

image

區(qū)別

image

二叉樹的遍歷方法

中序遍歷:即左-根-右遍歷,對于給定的二叉樹根宵统,尋找其左子樹晕讲;對于其左子樹的根,再去尋找其左子樹马澈;遞歸遍歷瓢省,直到尋找最左邊的節(jié)點i,其必然為葉子痊班,然后遍歷i的父節(jié)點勤婚,再遍歷i的兄弟節(jié)點。隨著遞歸的逐漸出棧涤伐,最終完成遍歷
先序遍歷:即根-左-右遍歷
后序遍歷:即左-右-根遍歷

在Java中常見的樹結構

二叉查找樹

二叉查找樹也稱為有序二叉查找樹,滿足二叉查找樹的一般性質,是指一棵空樹具有如下性質:
任意節(jié)點左子樹不為空,則左子樹的值均小于根節(jié)點的值
任意節(jié)點右子樹不為空,則右子樹的值均大于于根節(jié)點的值
任意節(jié)點的左右子樹也分別是二叉查找樹
沒有鍵值相等的節(jié)點

局限性及應用
一個二叉查找樹是由n個節(jié)點隨機構成,所以馒胆,對于某些情況,二叉查找樹會退化成一個有n個節(jié)點的線性鏈.如下圖:

image.png

AVL樹

AVL樹是帶有平衡條件的二叉查找樹缨称,和紅黑樹相比,它是嚴格的平衡二叉樹,平衡條件必須滿足(所有節(jié)點的左右子樹高度差不超過1).不管我們是執(zhí)行插入還是刪除操作,只要不滿足上面的條件,就要通過旋轉來保持平衡,而旋轉是非常耗時的

使用場景:

AVL樹適合用于插入刪除次數比較少,但查找多的情況祝迂。
也在Windows進程地址空間管理中得到了使用
旋轉的目的是為了降低樹的高度睦尽,使其平衡

AVL樹特點:
AVL樹是一棵二叉搜索樹
AVL樹的左右子節(jié)點也是AVL樹
AVL樹擁有二叉搜索樹的所有基本特點
每個節(jié)點的左右子節(jié)點的高度之差的絕對值最多為1,即平衡因子為范圍為[-1,1]

紅黑樹

一種自平衡二叉查找樹, 通過對任何一條從根到葉子的路徑上各個節(jié)點著色的方式的限制,紅黑樹確保從根到葉子節(jié)點的最長路徑不會是最短路徑的兩倍型雳,用非嚴格的平衡來換取增刪節(jié)點時候旋轉次數的降低当凡,任何不平衡都會在三次旋轉之內解決

使用場景:

紅黑樹多用于搜索,插入,刪除操作多的情況下
紅黑樹應用比較廣泛:
1.廣泛用在C++STL中。mapset都是用紅黑樹實現的纠俭。
2.著名的linux進程調度Completely Fair Scheduler,用紅黑樹管理進程控制塊宁玫。
3.epoll在內核中的實現,用紅黑樹管理事件塊
4.nginx中柑晒,用紅黑樹管理timer

原因:
紅黑樹的查詢性能略微遜色于AVL樹,因為比AVL樹會稍微不平衡最多一層眷射,也就是說紅黑樹的查詢性能只比相同內容的AVL樹最多多一次比較匙赞,但是,紅黑樹在插入和刪除上完爆AVL樹妖碉,AVL樹每次插入刪除會進行大量的平衡度計算涌庭,而紅黑樹為了維持紅黑性質所做的紅黑變換和旋轉的開銷,相較于AVL樹為了維持平衡的開銷要小得多

性質:
1.節(jié)點是紅色或黑色欧宜。
2.根節(jié)點是黑色坐榆。
3.每個葉子節(jié)點都是黑色的空節(jié)點(NIL節(jié)點)。
4 每個紅色節(jié)點的兩個子節(jié)點都是黑色冗茸。(從每個葉子到根的所有路徑上不能有兩個連續(xù)的紅色節(jié)點)
5.從任一節(jié)點到其每個葉子的所有路徑都包含相同數目的黑色節(jié)點席镀。

B樹

B-樹就是B樹,-只是一個符號.
B樹(B-Tree)是一種自平衡的樹,它是一種多路搜索樹(并不是二叉的),能夠保證數據有序夏漱。同時它還保證了在查找豪诲、插入、刪除等操作時性能都能保持在O(logn)挂绰,為大塊數據的讀寫操作做了優(yōu)化,同時它也可以用來描述外部存儲(支持對保存在磁盤或者網絡上的符號表進行外部查找)

特點:
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)

image.png

插入與平衡過程

這個圖用以表示往 4 階 B 樹中依次插入下面這組數據的過程:
6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4

image

4 階 B 樹表示每個節(jié)點最多有 4 個子樹秦士、3 個關鍵字,最少有 2 個子樹荔仁、一個關鍵字

添加/刪除也是一樣的伍宦,要考慮添加/刪除孩子后芽死,父節(jié)點是否還滿足子樹 k 介于 M/2M 的條件,不滿足就得從別的節(jié)點拆子樹甚至修改相關子樹結構來保持平衡次洼。

B+樹

B+樹是B-樹的變體关贵,也是一種多路搜索樹
B+的搜索與B-樹也基本相同,區(qū)別是B+樹只有達到葉子結點才命中(B-樹可以在非葉子結點命中)卖毁,其性能也等價于在關鍵字全集做一次二分查找揖曾;

B+的特性:
1.所有關鍵字都出現在葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字恰好是有序的
2.不可能在非葉子結點命中
3.非葉子結點相當于是葉子結點的索引(稀疏索引)亥啦,葉子結點相當于是存儲(關鍵字)數據的數據層
4.更適合文件索引系統(tǒng)

原因: 增刪文件(節(jié)點)時炭剪,效率更高,因為B+樹的葉子節(jié)點包含所有關鍵字翔脱,并以有序的鏈表結構存儲奴拦,這樣可很好提高增刪效率
如:(M=3)

image.png

使用場景:

文件系統(tǒng)和數據庫系統(tǒng)中常用的B/B+ 樹,他通過對每個節(jié)點存儲個數的擴展届吁,使得對連續(xù)的數據能夠進行較快的定位和訪問错妖,能夠有效減少查找時間,提高存儲的空間局部性從而減少IO操作疚沐。他廣泛用于文件系統(tǒng)及數據庫中暂氯,如:
Windows:HPFS 文件系統(tǒng)
Mac:HFS,HFS+ 文件系統(tǒng)
Linux:ResiserFS亮蛔,XFS痴施,Ext3FS,JFS 文件系統(tǒng)
數據庫:ORACLE究流,MYSQL辣吃,SQLSERVER 等中

B樹:有序數組+平衡多叉樹
B+樹:有序數組鏈表+平衡多叉樹

B+ 樹的優(yōu)點:

1.層級更低,IO 次數更少
2.每次都需要查詢到葉子節(jié)點梯嗽,查詢性能穩(wěn)定
3.葉子節(jié)點形成有序鏈表齿尽,范圍查詢方便

B+數插入和平衡

image

B+樹還有一個最大的好處,方便掃庫灯节,B樹必須用中序遍歷的方法按序掃庫循头,而B+樹直接從葉子結點挨個掃一遍就完了,B+樹支持range-query非常方便炎疆,而B樹不支持卡骂。這是數據庫選用B+樹的最主要原因。

比如要查 5-10之間的形入,B+樹一把到5這個標記全跨,再一把到10,然后串起來就行了亿遂,B樹就非常麻煩浓若。B樹的好處渺杉,就是成功查詢特別有利,因為樹的高度總體要比B+樹矮挪钓。不成功的情況下是越,B樹也比B+樹稍稍占一點點便宜。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末碌上,一起剝皮案震驚了整個濱河市倚评,隨后出現的幾起案子,更是在濱河造成了極大的恐慌馏予,老刑警劉巖天梧,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異霞丧,居然都是意外死亡呢岗,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門蛹尝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敷燎,“玉大人,你說我怎么就攤上這事箩言。” “怎么了焕襟?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵陨收,是天一觀的道長。 經常有香客問我鸵赖,道長务漩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任它褪,我火速辦了婚禮饵骨,結果婚禮上,老公的妹妹穿的比我還像新娘茫打。我一直安慰自己居触,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布老赤。 她就那樣靜靜地躺著轮洋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抬旺。 梳的紋絲不亂的頭發(fā)上弊予,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音开财,去河邊找鬼汉柒。 笑死误褪,一個胖子當著我的面吹牛,可吹牛的內容都是我干的碾褂。 我是一名探鬼主播兽间,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼斋扰!你這毒婦竟也來了渡八?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤传货,失蹤者是張志新(化名)和其女友劉穎屎鳍,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體问裕,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡逮壁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了粮宛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窥淆。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖巍杈,靈堂內的尸體忽然破棺而出忧饭,到底是詐尸還是另有隱情,我是刑警寧澤筷畦,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布词裤,位于F島的核電站,受9級特大地震影響鳖宾,放射性物質發(fā)生泄漏吼砂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一鼎文、第九天 我趴在偏房一處隱蔽的房頂上張望渔肩。 院中可真熱鬧,春花似錦拇惋、人聲如沸周偎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽栏饮。三九已至,卻和暖如春磷仰,著一層夾襖步出監(jiān)牢的瞬間袍嬉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伺通,地道東北人箍土。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像罐监,于是被迫代替她去往敵國和親吴藻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容

  • 一些概念 數據結構就是研究數據的邏輯結構和物理結構以及它們之間相互關系弓柱,并對這種結構定義相應的運算沟堡,而且確保經過這...
    Winterfell_Z閱讀 5,660評論 0 13
  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結點至多有m個孩子。 除根結點和葉子結點外矢空,其它每個結點至少有m...
    文檔隨手記閱讀 13,183評論 0 25
  • 目錄 1航罗、什么是樹 2、相關術語 3屁药、二叉樹 3.1粥血、二叉樹的類型 3.2、二叉樹的性質 3.3酿箭、二叉樹的結構 3...
    我哈啊哈啊哈閱讀 2,536評論 0 10
  • 目錄 0.樹0.1 一般樹的定義0.2 二叉樹的定義 1.查找樹ADT 2.查找樹的實現2.1 二叉查找樹2.2 ...
    王偵閱讀 7,125評論 0 3
  • 上周的拍賣會上,有位北京用戶收到了8個面試邀請妇蛀,包括阿里刹淌、美團、滴滴和幾個A輪的創(chuàng)業(yè)公司讥耗,在百度干了三年的他面對選...
    ffa8d8c7a037閱讀 1,157評論 0 3