注意:哈夫曼樹並不唯一,但帶權路徑長度一定是相同的。
- 二叉樹:每個結點最多含有兩個子樹的樹稱為二叉樹。
- 定理:對於具有n個葉子結點的哈夫曼樹,共有2n-1個結點。
哈夫曼樹介紹
1哈夫曼樹的定義
哈夫曼(Huffman)樹,又稱最優二叉樹,是由n個帶權葉子結點構成的所有二叉樹中帶權路徑長度最短的二叉樹。給定n個數值{ W1,W2,…,Wn},若將它們作為n個結點的權,並以這n個結點為葉子結點構造一顆二叉樹,那么就可以構造出多棵具有不同形態的二叉樹,其中帶權路徑長度最短的那棵二叉樹稱為哈夫曼樹,或稱最優二叉樹。如圖(二)所示:
WPL:樹中從根到所有葉子結點的各個帶權路徑長度之和
2 構建哈夫曼樹的方法
如下:
(1)初始化:根據給定的n個權值{W1,W2,….,Wn}構造n棵二叉樹的森林T{T1,T2,…Tn},其中每棵二叉樹Ti (1≤i≤n)中都只有一個帶權Wi為的根結點,其左、右子樹均為空。
(2)找最小樹:在森林T中選取兩棵結點權值最小的子樹分別作為左、右子樹構造一棵新的二叉樹、且使左子樹的權值小於右子樹的權值、且置新的二叉樹的根結點的權值為其左、右子樹上根結點權值之和。
(3)刪除與加入:在森林T中,刪除這二棵樹,同時將新得到的二叉樹加入T中。
(4)判斷:重復(2)與(3)操作,直到T只含一棵二叉樹樹為止,這棵樹便是哈夫曼樹。如圖(三)所示:
因為權值的不同,哈夫曼樹的樣子有點不同,為了加深對哈夫曼樹構建過程的認識,筆者再列舉一個哈夫曼樹的構建,見圖(四):
(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。
(注:如果兩個數的和正好是下一步的兩個最小數的其中的一個,那么這個樹直接往上生長就可以了,如果這兩個數的和比較大,不是下一步的兩個最小數的其中一個,那么就並列生長。)比如比較最小兩個 7 10 11 所以只能另起一個
(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。 好了,此時哈夫曼樹已經構建好了。