轉自:https://blog.csdn.net/shuangde800/article/details/7341289
一、哈夫曼樹的概念和定義
什么是哈夫曼樹?
讓我們先舉一個樣例。
判定樹:
if(score<60)
cout<<"Bad"<<endl;
else if(score<70)
cout<<"Pass"<<endl
else if(score<80)
cout<<"General"<<endl;
else if(score<90)
cout<<"Good"<<endl;
else
cout<<"Very good!"<<endl;
定義哈夫曼樹之前先說明幾個與哈夫曼樹有關的概念:
路徑:
樹中一個結點到還有一個結點之間的分支構成這兩個結點之間的路徑。
路徑長度:
路徑上的分枝數目稱作路徑長度。
樹的路徑長度:
從樹根到每個結點的路徑長度之和。
結點的帶權路徑長度:
在一棵樹中,假設其結點上附帶有一個權值,通常把該結點的路徑長度與該結點上的權值之積,稱為該結點的帶權路徑長度(weighted path length, WPL)
什么是權值?
計算機領域中(數據結構)
權值就是定義的路徑上面的值。能夠這樣理解為節點間的距離。通常指字符相應的二進制編碼出現的概率。
至於霍夫曼樹中的權值能夠理解為:權值大表明出現概率大!
一個結點的權值實際上就是這個結點子樹在整個樹中所占的比例.
abcd四個葉子結點的權值為7,5,2,4. 這個7,5,2,4是依據實際情況得到的,比方說從一段文本中統計出abcd四個字母出現的次數分別為7,5,2,4. 說a結點的權值為7,意思是說a結點在系統中占有7這個份量.實際上也能夠化為百分比來表示,但反而麻煩,實際上是一樣的.
樹的帶權路徑長度:
假設樹中每一個葉子上都帶有一個權值,則把樹中全部葉子的帶權路徑長度之和稱為樹的帶權路徑長度。
設某二叉樹有n個帶權值的葉子結點,則該二叉樹的帶權路徑長度記為:

公式中,wk為第k個葉子結點的權值;lk為該結點的路徑長度。
演示樣例:


它們的帶權路徑長度分別為:
圖a: WPL=5*2+7*2+2*2+13*2=54
圖b: WPL=5*3+2*3+7*2+13*1=48
可見,圖b的帶權路徑長度較小,我們可以證明圖b就是哈夫曼樹(也稱為最優二叉樹)。
