資料結構之哈夫曼樹(最優二叉樹)
文字壓縮是一種非常重要的技術,自然涉及到了壓縮編碼。哈夫曼編碼——一種最基本的壓縮編碼方法
幾個術語:
1、路徑:樹中兩個節點之間的分支序列
2、路徑長度:路徑上的分支數目
3、樹的路徑長度:從樹根到每個節點的路徑長度之和。在節點數目相同的二叉樹中,完全二叉樹的路徑長度最短
4、節點的權:在一些應用中,賦予樹中節點的 一個有某種意義的實數
5、節點的帶權路徑長度:從該節點到樹根之間的路徑長度與該節點的權的乘積
6、 樹的帶權路徑長度:樹中所有葉子節點的帶權路徑長度之和
7、最優二叉樹:帶權路徑長度最小的二叉樹
二叉樹的帶權路徑長度(WPL)=∑Wk*
舉個例子
圖中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個節點