最優二叉樹,也稱為哈夫曼樹,是指對於一組帶有確定權值的葉結點,構造的具有最小帶權路徑長度的二叉樹。
設二叉樹具有n個帶權值的葉子結點,則從根結點到每乙個葉子結點的路徑長度與該葉子結點權值的乘積之和稱為二叉樹路徑長度,記做:
wpl = w1l1 + w2l2 + ...... + wnln;
其中:n為二叉樹中葉子結點的個數;wk為第k個葉子的權值;lk為第k個葉子結點的路徑長度。
根據哈夫曼樹的定義,一棵二叉樹要使其wpl值越小,必須使權值越大的葉結點靠近根結點,二權值越小的葉結點越遠離根結點
哈夫曼樹的建立過程:
1.路徑長度:在樹中從乙個結點到另乙個結點所經歷的分支構成了這兩個結點間的路徑上的分支數稱為它的路徑長度
2.樹的路徑長度:從樹根到樹中每一結點的路徑長度之和。
3.樹的帶權路徑長度(weighted path length of tree,簡記為wpl)
結點的權:在一些應用中,賦予樹中結點的乙個有某種意義的實數。
結點的帶權路徑長度:結點到樹根之間的路徑長度與該結點上權的乘積。
樹的帶權路徑長度(weighted path length of tree):定義為樹中所有葉結點的帶權路徑長度之和
【例】給定4個葉子結點a,b,c和d,分別帶權7,5,2和4。構造如下圖所示的三棵二叉樹(還有許多棵),它們的帶權路徑長度分別為:
其中(c)樹的wpl最小,可以驗證,它就是哈夫曼樹。
**實現:
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace 用鏈式儲存結構表示二叉樹
public int lchild
public int rchild
public int parent
public hnode()
}//哈夫曼樹
class huffmantree
public hnode this[int index]
set
}public huffmantree (int n)
leafnum = n;
}/// /// 建立哈夫曼樹
///
public void create()
//處理n個葉子結點,建立哈夫曼樹
for (int i = 0; i < this .leafnum +-1; i++)
個葉結點的權值,輸入一次按回車鍵一次", leafnum);
ht.create();
console.writeline("位置\t權值\t父結點\t左孩子結點\t右孩子結點");
for (int i = 0; i < 2*leafnum -1; i++)
\t\t\t\t",i,ht[i].weight ,ht[i].parent, ht[i].lchild , ht[i].rchild );
}console.readline();}}
執行結果:
哈夫曼樹(最優二叉樹)
給定n個權值作為n的 葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小 所謂樹的帶權路徑長度,就是樹中所有的葉結點 的權值乘上其到根結點的路徑長度 稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設有n個權值,則構造出的...
哈夫曼樹(最優二叉樹)
最優二叉樹 哈夫曼樹 給定n個權值,試構造一棵有n個葉子結點的二叉樹,每個葉子結點帶權為wi。構造出來的二叉樹的形態可以有多個,我們把其中帶權路徑長度wpl最小的二叉樹稱作最優二叉樹或者哈夫曼樹。語言描述 根據給定的n個權值構成n棵二叉樹的集合f 其中每棵二叉樹ti中只有乙個帶權為wi的根結點,其左...
哈夫曼樹 最優二叉樹
差點忘記寫部落格了.哈夫曼樹 其實就是只利用葉子結點來儲存要用資訊的樹,只不過它在構造的時候就擁有了乙個迷人的特性.就是wpl 帶權路徑長度 是最小的.而且還能用這個樹的來為葉子結點中的資訊進行編碼,得出來的各個編碼一定不會相同,並且不會產生混淆的情況.通過哈夫曼樹的特點.實現了根據乙個佇列來建立一...