【1】赫夫曼樹基本概念
別名“最優樹”,是一種帶權路徑最短的樹。
(1)路徑:從樹中一個結點到另一個結點之間的分支構成這兩個結點之間的路徑。
(2)路徑長度:路徑上的分支數目。
(3)樹的路徑長度:從樹根到一每結點的路徑長度之和。
(4)結點的帶權路徑長度:從該結點到樹根之間的路徑長度與結點上權值的乘積。
(5)樹的帶權路徑長度:樹中所有葉子結點的帶權路徑長度之和。記作:WPL
【2】赫夫曼樹的構造
(1)由給定的n個權值{W1,W2,…,Wn}構成n棵二叉樹的集合F={T1,T2,…,Tn} 其中每棵二叉樹Ti中只有一個帶權為Wi的根節點,其左右子樹均空。
(2)在F中選取根結點的權值最小和次小的兩棵二叉樹作為左、右子樹構造一棵新的二叉樹。
這棵新的二叉樹根結點的權值為其左、右子樹根結點權值之和;
(3)在集合F中刪除作為左、右子樹的兩棵二叉樹,並將新建立的二叉樹加入到集合F中。
(4)重復(2)(3)兩步,當F中只剩下一棵二叉樹時,這棵二叉樹便是所要建立的哈夫曼樹。
在構造赫夫曼樹的時,尤其注意第三步,在F中刪除所指的兩棵樹后,一定記住將新得到的二叉樹加入F中。
例:設給定權集w = {5, 29, 7, 8, 14, 23, 3, 11},構造關於w的一棵赫夫曼樹,並求其加權路徑長度WPL。
在構造赫夫曼樹的過程中,在第二次選擇兩棵權值最小樹時,最小的兩個作為左右子樹的分別是7和8。
而此時的8有兩種:一種是原來權值集中的,另一種是經過第一次構造出的新的二叉樹的根的權值。如上圖樹1和樹2所示。
所以,7與不同的8結合,便生成了不同的赫夫曼樹,但是它們的WPL是相同的。計算過程如下:
樹1:WPL = 2×23 + 3×(8+11) + 2×29 + 3×14 + 4×7 + 5×(3+5) = 271
樹2:WPL = 2×23 + 3×11 + 4×(3+5)+ 2×29 + 3×14 + 4×(7+8) = 271
赫夫曼樹編碼圖如下:
【3】赫夫曼樹的實現
實現代碼如下:
Good Good Study, Day Day Up.
順序 選擇 循環 總結