算法(二):樹,以及變形

二叉樹

從二叉樹說起,
先序遍歷:先訪問根,先序遍歷左子樹,先序遍歷右子樹
中序遍歷:中序遍歷左子樹,訪問根,中序遍歷右子樹
後序遍歷:後序遍歷左子樹,後序遍歷右子樹,訪問根
即,X序遍歷,指的是相對根而言。
由遍歷構造二叉樹:
選擇兩個遍歷方法,其中一個爲中序遍歷,另一個爲其他遍歷(先序或者後續或者層次),均可以復現原二叉樹。

線索二叉樹

二叉樹線索化規定:

若無左子樹,令節點的左指針指向其前驅,否則指向左子樹;若無右子樹,令該節點指向其後繼節點,否則指向由子樹。

這裏所指的前驅和後繼根據先序中序後序的不同所指向的節點不同。
但一般來說:中序線索化二叉樹可以很好的服務運算

二叉排序樹

其定義如下:
1.任何一個節點的左子樹上的關鍵字均小於根節點的關鍵字
2.任何一個節點的右子樹上的關鍵字均大於根節點的關鍵字
二叉排序樹的構造,插入方法都異常簡單,稍微複雜一點的是刪除方法。
刪除節點的規則如下:
若待刪除節點:
①右子樹空,用左子女填補
②左子樹空,用右子女填補
③左右子樹均不爲空,在右子樹上找中序第一個子女填補;或者在左子樹找到中序遍歷的最後一個子女。

平衡二叉樹

任意節點的左右子樹高度差的絕對值不超過1,這樣的二叉樹爲平衡二叉樹(AVL數)

左右子樹的高度差爲該節點的平衡因子,平衡二叉樹的平衡因子只可能是-1,0,1.
平衡二叉樹是爲了避免數的高度增長過快,而降低二叉排序樹的性能。
具體的刪除和插入方法導致的不平衡後如何恢復平衡,方法參照平衡二叉樹的插入刪除操作

哈夫曼編碼

哈夫曼數的構造:
從一堆節點中選擇兩個權值最小的節點作爲數的兩個左右子樹,其根是該兩個節點之和。
從原先的節點中刪除這兩個節點,並添加兩個節點的和作爲新節點。
一直重複上述過程,知道節點堆爲空。
具體如下圖:
哈夫曼編碼構造圖

紅黑樹

紅黑樹雖然不能像平衡二叉樹那麼做到左右子樹的完全平衡,但大體上也還是高度平衡的樹。
其好處是不用像二叉平衡樹那樣的多震盪——插入節點或者刪除容易引起對樹的修改。
紅黑樹在需要大量插入和刪除時,效率更高。

紅黑樹的特性:
(1)每個節點或者是黑色,或者是紅色。
(2)根節點是黑色。
(3)每個葉子節點(NIL)是黑色。 [注意:這裏葉子節點,是指爲空(NIL或NULL)的葉子節點!]
(4)如果一個節點是紅色的,則它的子節點必須是黑色的。
(5)從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點。

注意:
(01) 特性(3)中的葉子節點,是隻爲空(NIL或null)的節點。
(02) 特性(5),確保沒有一條路徑會比其他路徑長出倆倍。因而,紅黑樹是相對是接近平衡的二叉樹。

B樹

又稱爲多路平衡查找樹。
其實可以理解爲類似於索引查找的那種結構。
B數有一個階,爲m。
表示每個節點最多的子樹個數。
b數
如上圖。
每個關鍵字在樹中只出現一次。

B+樹

是B數的變形,主要是爲了數據庫應用而來。主要的改造在於,子節點會包含父節點的信息。
所有的查找都會到子節點結束。
並且子節點有指向具體記錄的指針。
B+樹
還是貼一下參考文獻:
B樹、B-樹、B+樹與紅黑樹

發佈了72 篇原創文章 · 獲贊 50 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章