1. 程式人生 > >資料結構之哈夫曼樹(最優二叉樹)

資料結構之哈夫曼樹(最優二叉樹)

文字壓縮是一種非常重要的技術,自然涉及到了壓縮編碼。哈夫曼編碼——一種最基本的壓縮編碼方法

幾個術語:

1、路徑:樹中兩個節點之間的分支序列

2、路徑長度:路徑上的分支數目

3、樹的路徑長度:從樹根到每個節點的路徑長度之和。在節點數目相同的二叉樹中,完全二叉樹的路徑長度最短

4、節點的權:在一些應用中,賦予樹中節點的 一個有某種意義的實數

5、節點的帶權路徑長度:從該節點到樹根之間的路徑長度與該節點的權的乘積

6、 樹的帶權路徑長度:樹中所有葉子節點的帶權路徑長度之和

7、最優二叉樹:帶權路徑長度最小的二叉樹

二叉樹的帶權路徑長度(WPL)=∑Wk*

Lk 其中,Wk為第k個葉子節點的權值;Lk為第k個葉子節點到根節點的路徑長度。

舉個例子

這裡寫圖片描述

圖中c事實上就是最優二叉樹,即哈夫曼樹

哈夫曼樹的建立

哈夫曼樹的特點是權值越大的葉子節點越靠近根節點,而權值越小的葉子節點越遠離根節點。

基本思想:
1、根據給出的n個權值{w1 ,w2 , w3 ,……… , wn},構成n棵二叉樹的集合F={T1, T2,T3,…….. ,Tn},其中每顆二叉樹T1中只有一個帶權為W1的根節點,其左右字數均為空。
2、在集合F中選取根節點的權值最小和次最小的兩顆樹作為左、右子樹構造一顆新的二叉樹,這顆新的二叉樹的根節點的權值為其左、右子樹根節點的權值之和

3、在集合F中刪除作為左、右子樹的兩顆二叉樹,並將新建立的二叉樹加入集合F中。
4、重複2、3兩步,當集合F中只剩下一顆二叉樹時,這顆二叉樹便是所要建立的哈夫曼樹。

舉個例子

有A B C D E五個葉子節點且權值集合為W={2,3,4,3,3}的一顆哈夫曼樹的構造過程
如下圖所示

這裡寫圖片描述

注意:

1、選取兩顆根節點權值最小的二叉樹,當有權值相同的情況時,可以在相同權值的二叉樹中任選一顆

2、兩顆根節點最小的二叉樹組成新的二叉樹的左、右子樹時,誰左誰右沒有規定。

3、哈夫曼樹中,權值越大的葉子節點離根越近,這也是WPL最小哦啊的實際根據和哈夫曼樹的應用依據

4、哈夫曼樹中沒有度為1的節點,二叉樹的相關性質對哈夫曼樹也實用。如根據二叉樹的性質n0=n2+1,可推出有n個葉子結點的哈夫曼樹共有2n-1個節點