哈夫曼樹以及哈夫曼編碼的構造步驟

2021-08-20 15:49:58 字數 2575 閱讀 9909

注意:哈夫曼樹並不唯一,但帶權路徑長度一定是相同的。

第一部分;由給定結點構造哈夫曼樹

(1)8個結點的權值大小如下:

(2)從19,21,2,3,6,7,10,32中選擇兩個權小結點。選中2,3。同時算出這兩個結點的和5。

(3)從19,21,6,7,10,32,5中選出兩個權小結點。選中5,6。同時計算出它們的和11。

(4)從19,21,7,10,32,11中選出兩個權小結點。選中7,10。同時計算出它們的和17。

(btw:這時選出的

兩個數字都不是已經構造好的二叉樹裡面的結點

,所以要另外開一棵二叉樹;或者說,

如果兩個數的和正好是下一步的兩個最小數的其中的乙個

,那麼這個樹直接往上生長就可以了,如果這兩個數的和比較大,不是下一步的兩個最小數的其中乙個,那麼就並列生

長。)

(5)從19,21,32,11,17中選出兩個權小結點。選中11,17。同時計算出它們的和28。

(6)從19,21,32,28中選出兩個權小結點。選中19,21。同時計算出它們的和40。另起一顆二叉樹。

(7)從32,28, 40中選出兩個權小結點。選中28,32。同時計算出它們的和60。  

(8)從 40, 60中選出兩個權小結點。選中40,60。同時計算出它們的和100。 好了,此時哈夫曼樹已經構建好了。

第二部分:由上述所得

哈夫曼樹

寫出哈夫曼編碼

首先我們來看這棵構造好的哈夫曼樹:(經過左邊路徑為0,經過右邊路徑為1)

則可直接寫出編碼,例如:

為了簡便起見,我們從樹的左邊開始考慮,即b,e,f節點。

對於節點b,其深度為3,權值為5,那麼其帶權路徑長度為5*3 = 15;

那麼我們再看一下節點b的父親節點,其權值為9,是由權值為4和權值為5的節點b構造而成,那麼即是9 = 4 + 5;

同樣的再往上一層,節點b的爺爺節點,其權值為16,是由權值為9和權值為7的節點構造而成,而權值為9的節點的構造前面已經說明,則有16 = 4 + 5 + 7;

再往上一層就到根節點了。

那麼到這裡我們可以看到,節點b的父親節點和爺爺節點的組成部分都有節點b的「功勞」,即節點b的權值是其另外兩個的「組成部分」,那麼節點b的帶權路徑長度即為其到根節點路徑上(不包含根節點),與其(或者說是與其父節點,爺爺節點等)有父子關係的節點抽取出節點b的組成部分(包括節點b本身),再全部相加,這樣的話就得到了節點b的帶權路徑長度為5 + 5 + 5 = 15;

同樣的,節點e,f按照同樣的方法進行推導。

所以我們從上面的分析得出:

每個帶權葉節點到根節點的帶權路徑長度等於其到根節點路徑上所有節點的包含該帶權葉節點權值組成部分之和。

因此,最後我們推導出,所有葉節點,即整棵哈夫曼樹的帶權路徑長度 wpl即為:

除了根節點以外,所有節點的權值之和。

如上圖哈夫曼樹的帶權路徑長度 wpl即為:

wpl = 16 + 10 + 9 + 7 + 5 + 5 + 4 + 5 + 3 + 4 + 2 + 3 + 2 + 2 + 2 + 1 + 1 + 1 = 82

有了這樣的判斷之後,我們便很容易計算出一顆哈夫曼樹的帶權路徑wpl了。

因此我們可以借助乙個叫做優先佇列的資料結構,而優先佇列的實現往往是借助於二叉堆的結構實現,在這裡我們要實現的是小根堆的資料結構。一開始的時候,我們可以將所有的節點乙個乙個的壓入佇列中,每次有節點入隊,佇列都會進行自調整,使其保持乙個小根堆的狀態。當所有的節點全部入隊之後,這時候我們根據以上推導出來的結論,每次取兩個權值最小的節點,將其值計算之後,然後再將兩個節點權值之和的節點壓入佇列中,直到佇列中只剩下乙個節點(即根節點),跳出迴圈體,輸出最後的答案。即整棵哈夫曼樹的帶權路徑wpl。

構造哈夫曼樹 哈夫曼編碼

1.權值越大的節點,距離根越近 2.樹中沒有度為1的節點,這類樹叫正則 嚴格 二叉樹,樹的總節點 2 雙分支結點 1 單分支結點 雙分支結點 3.樹的帶權路勁 wpl 所有葉子結點的帶權長度路勁之和 長度最短。嗶哩嗶哩王卓老師的口訣 構造森林全是根,選用兩小選新樹,刪除兩小添新人,重複23剩單根 1...

哈夫曼樹構造 哈夫曼編碼

一 哈夫曼樹 p189 1.定義 帶權路徑長度 wpl 最小的二叉樹稱為哈夫曼樹 wpl 樹中所有葉子節點的帶權路徑長度之和 帶權路徑長度 從樹根到任意節點的路徑長度與該節點上權值的乘積 2.構造 1 將這n個節點分別作為n課僅含乙個結點的二叉樹,構成森林f 2 構造乙個新節點,從f中選取兩棵根節點...

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....