常見樹的簡介

數(shù)據(jù)結(jié)構(gòu)中為了存儲和查找的方便靠闭,用各種樹結(jié)構(gòu)來存儲文件,此文就簡單總結(jié)一下各種樹的特點塞琼,使讀者對常見的樹有個基本的認(rèn)識菠净,針對不同樹的詳解有專門的文章描述。本章涉及的樹結(jié)構(gòu)包括:二叉查找樹(二叉排序樹)彪杉、平衡二叉樹(AVL樹)毅往、紅黑樹、B-樹派近、B+樹攀唯、B*樹、(字典樹(trie樹)渴丸、后綴樹侯嘀、廣義后綴樹,這些不做講解)曙强。

1式曲、二叉查找樹(二叉排序樹/BST樹)

(圖a)

二叉查找樹是一種動態(tài)查找表(圖a),具有這些性質(zhì):

(1)所有非葉子結(jié)點至多擁有兩個兒子(Left和Right)

(2)所有結(jié)點存儲一個關(guān)鍵字

(3)若它的左子樹不為空收擦,則左子樹上的所有節(jié)點的值都小于它的根節(jié)點的值鼓拧;

(4)若它的右子樹不為空,則右子樹上所有節(jié)點的值都大于它的根節(jié)點的值娜扇;

(5)其他的左右子樹也分別為二叉查找樹错沃;

(6)二叉查找樹是動態(tài)查找表栅组,在查找的過程中可見添加和刪除相應(yīng)的元素,在這些操作中需要保持二叉查找樹的以上性質(zhì)枢析。

【說明】

????????如果BST樹的所有非葉子結(jié)點的左右子樹的結(jié)點數(shù)目均保持差不多(平衡)玉掸,那么B樹

的搜索性能逼近二分查找;但它比連續(xù)內(nèi)存空間的二分查找的優(yōu)點是醒叁,改變BST樹結(jié)構(gòu)

(插入與刪除結(jié)點)不需要移動大段的內(nèi)存數(shù)據(jù)司浪,甚至通常是常數(shù)開銷;

???????如:


???但BST樹在經(jīng)過多次插入與刪除后把沼,有可能導(dǎo)致不同的結(jié)構(gòu):

右邊也是一個BST樹啊易,但它的搜索性能已經(jīng)是線性的了;同樣的關(guān)鍵字集合有可能導(dǎo)致不同的

樹結(jié)構(gòu)索引饮睬;所以租谈,使用BST樹還要考慮盡可能讓BST樹保持左圖的結(jié)構(gòu),和避免右圖的結(jié)構(gòu)捆愁,也就

是所謂的“平衡”問題割去。

2、平衡二叉樹(AVL樹)

含有相同節(jié)點的二叉查找樹可以有不同的形態(tài)昼丑,而二叉查找樹的平均查找長度與樹的深度有關(guān)呻逆,所以需要找出一個查找平均長度最小的一棵,那就是平衡二叉樹(圖b)矾克,具有以下性質(zhì):


(圖b)

(1)要么是棵空樹页慷,要么其根節(jié)點左右子樹的深度之差的絕對值不超過1;

(2)其左右子樹也都是平衡二叉樹胁附;

(3)二叉樹節(jié)點的平衡因子定義為該節(jié)點的左子樹的深度減去右子樹的深度酒繁。則平衡二叉樹的所有節(jié)點的平衡因子只可能是-1,0,1。

3控妻、紅黑樹


(圖c)

紅黑樹是一種自平衡二叉樹州袒,在平衡二叉樹的基礎(chǔ)上每個節(jié)點又增加了一個顏色的屬性,節(jié)點的顏色只能是紅色或黑色弓候。具有以下性質(zhì):

(1)根節(jié)點只能是黑色郎哭;

(2)每個結(jié)點要么是紅的,要么是黑的菇存;

(3)每個葉結(jié)點夸研,即空結(jié)點(NIL)是黑的;

(4)對每個結(jié)點依鸥,從該結(jié)點到根結(jié)點的所有路徑上包含相同數(shù)目的黑結(jié)點亥至。

4、B-樹

??如:(M=3)


(圖d)

B-樹是一種平衡多路查找樹,它在文件系統(tǒng)中很有用姐扮。一棵M階B-樹(圖d為3階B-樹)絮供,具有下列性質(zhì):

(1)樹中每個節(jié)點至多有M棵子樹;

(2)若根節(jié)點不是葉子節(jié)點茶敏,則子樹個數(shù)的范圍為[2, M]壤靶;

(3)除根結(jié)點以外的非葉子結(jié)點的子樹個數(shù)的范圍為[M/2, M];

(4)每個結(jié)點存放至少M/2-1(取上整)和至多M-1個關(guān)鍵字惊搏,(至少2個關(guān)鍵字)贮乳;

(5)所有的葉子節(jié)點都出現(xiàn)在同一層次上,且不帶任何信息胀屿,也是為了保持算法的一致性塘揣。

5、B+樹

????如:(M=3)

(圖e)

B+數(shù)是B-樹的一種變形宿崭,它與B-樹的差別在于(圖e為3階B+樹):

(1)有n棵子樹的節(jié)點含有n個關(guān)鍵字;

(2)所有的葉子節(jié)點包含了全部關(guān)鍵字的信息才写,及指向這些關(guān)鍵字記錄的指針葡兑,且葉子節(jié)點本身按關(guān)鍵字大小自小到大順序鏈接;

(3)所有非終端節(jié)點可以看成是索引部分赞草,節(jié)點中僅含有其子樹(根節(jié)點)中最大(或最卸锏獭)關(guān)鍵字,所有B+樹更像一個索引順序表厨疙;

(4)對B+樹進(jìn)行查找運算洲守,一是從最小關(guān)鍵字起進(jìn)行順序查找,二是從根節(jié)點開始沾凄,進(jìn)行隨機(jī)查找梗醇。

【說明】

更適合文件索引系統(tǒng);比如對已經(jīng)建立索引的數(shù)據(jù)庫記錄撒蟀,查找10<=id<=20叙谨,那么只要通過根節(jié)點搜索到id=10的葉節(jié)點,之后只要根據(jù)葉節(jié)點的鏈表找到第一個大于20的就行了保屯,比B-樹在查找10到20內(nèi)的每一個是每次都從根節(jié)點出發(fā)查找提高了不少效率手负。

6、B*樹

是B+樹的變體姑尺,在B+樹的非根和非葉子結(jié)點再增加指向兄弟的指針:

(圖f)

(1)B*樹定義了非葉子結(jié)點關(guān)鍵字個數(shù)至少為(2/3)*M竟终,即塊的最低使用率為2/3

(代替B+樹的1/2);

(2)B+樹的分裂:當(dāng)一個結(jié)點滿時切蟋,分配一個新的結(jié)點统捶,并將原結(jié)點中1/2的數(shù)據(jù)復(fù)制到新結(jié)點,最后在父結(jié)點中增加新結(jié)點的指針;B+樹的分裂只影響原結(jié)點和父結(jié)點瘾境,而不會影響兄弟結(jié)點歧杏,所以它不需要指向兄弟的指針;

B*樹的分裂:當(dāng)一個結(jié)點滿時迷守,如果它的下一個兄弟結(jié)點未滿犬绒,那么將一部分?jǐn)?shù)據(jù)移到兄弟結(jié)點中,再在原結(jié)點插入關(guān)鍵字兑凿,最后修改父結(jié)點中兄弟結(jié)點的關(guān)鍵字(因為兄弟結(jié)點的關(guān)鍵字范圍改變了)凯力;如果兄弟也滿了,則在原結(jié)點與兄弟結(jié)點之間增加新結(jié)點礼华,并各復(fù)制1/3的數(shù)據(jù)到新結(jié)點咐鹤,最后在父結(jié)點增加新結(jié)點的指針;

所以圣絮,B*樹分配新結(jié)點的概率比B+樹要低祈惶,空間使用率更高;

【B樹相關(guān)的小結(jié)】

?????? B樹:二叉樹扮匠,每個結(jié)點只存儲一個關(guān)鍵字捧请,等于則命中,小于走左結(jié)點棒搜,大于走右結(jié)點疹蛉;

?????? B-樹:多路搜索樹,每個結(jié)點存儲M/2到M個關(guān)鍵字力麸,非葉子結(jié)點存儲指向關(guān)鍵字范圍的子結(jié)點可款;所有關(guān)鍵字在整顆樹中出現(xiàn),且只出現(xiàn)一次克蚂,非葉子結(jié)點可以命中闺鲸;

?????? B+樹:在B-樹基礎(chǔ)上,為葉子結(jié)點增加鏈表指針陨舱,所有關(guān)鍵字都在葉子結(jié)點中出現(xiàn)翠拣,非葉子結(jié)點作為葉子結(jié)點的索引;B+樹總是到葉子結(jié)點才命中游盲;

?????? B*樹:在B+樹基礎(chǔ)上误墓,為非葉子結(jié)點也增加鏈表指針,將結(jié)點的最低利用率從1/2提高到2/3益缎;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谜慌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子莺奔,更是在濱河造成了極大的恐慌欣范,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異恼琼,居然都是意外死亡妨蛹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門晴竞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛙卤,“玉大人,你說我怎么就攤上這事噩死〔眩” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵已维,是天一觀的道長行嗤。 經(jīng)常有香客問我,道長垛耳,這世上最難降的妖魔是什么栅屏? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮艾扮,結(jié)果婚禮上既琴,老公的妹妹穿的比我還像新娘。我一直安慰自己泡嘴,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布逆济。 她就那樣靜靜地躺著酌予,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奖慌。 梳的紋絲不亂的頭發(fā)上抛虫,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機(jī)與錄音简僧,去河邊找鬼建椰。 笑死,一個胖子當(dāng)著我的面吹牛岛马,可吹牛的內(nèi)容都是我干的棉姐。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼啦逆,長吁一口氣:“原來是場噩夢啊……” “哼伞矩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起夏志,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤乃坤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體湿诊,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡狱杰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了厅须。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仿畸。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖九杂,靈堂內(nèi)的尸體忽然破棺而出颁湖,到底是詐尸還是另有隱情,我是刑警寧澤例隆,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布甥捺,位于F島的核電站,受9級特大地震影響镀层,放射性物質(zhì)發(fā)生泄漏镰禾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一唱逢、第九天 我趴在偏房一處隱蔽的房頂上張望吴侦。 院中可真熱鬧,春花似錦坞古、人聲如沸备韧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽织堂。三九已至,卻和暖如春奶陈,著一層夾襖步出監(jiān)牢的瞬間易阳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工吃粒, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留潦俺,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓徐勃,卻偏偏與公主長得像事示,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疏旨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容