所謂哈夫曼樹即最優二叉樹,其特點是帶權路徑長度最小problem description建樹原理:將最小數結點放到最下面,大數放到離頂點近的地方,建樹時從下往上建,每上一層下一層的數就被重複加一次,這樣最終得到完整樹
資料結構實驗之二叉樹六:哈夫曼編碼
字元的編碼方式有多種,除了大家熟悉的ascii編碼,哈夫曼編碼(huffman coding)也是一種編碼方式,它是可變字長編碼。該方法完全依據字元出現概率來構造出平均長度最短的編碼,稱之為最優編碼。哈夫曼編碼常被用於資料檔案壓縮中,其壓縮率通常在20%~90%之間。你的任務是對從鍵盤輸入的乙個字串求出它的ascii編碼長度和哈夫曼編碼長度的比值。
input
輸入資料有多組,每組資料一行,表示要編碼的字串。
output
對應字元的ascii編碼長度la,huffman編碼長度lh和la/lh的值(保留一位小數),資料之間以空格間隔。
上圖中帶權路徑的計算方法:1.圓圈為二叉樹的各個結點,三角形為每一層的權值可認為沒有路徑,把三層的權值加起來j即可
2.用結點計算,最下面為最初的兩個結點,他們到定點8的路徑長度為3,所以帶權路徑長度為(1+1)*3=6。以此類推即可。
#include #include #include#include using namespace std;
int main()
{priority_queue,greater >q;///優先佇列從小到大排序,小的在隊首。
int len,a[1001];
char s[1001];
while(cin>>s)
{ int sum=0;
memset(a,0,sizeof(a));
len=strlen(s);
int la=len*8;
for(int i=0;i晚安!
最優二叉樹
include include includetypedef struct huffmantree typedef char huffmancode 赫夫曼編碼 void selectnode huffmantree ht,int n,int bt1,int bt2 從1 i 1個結點選擇paren...
滿二叉樹 完全二叉樹 平衡二叉樹 最優二叉樹
一棵二叉樹的結點要麼是葉子結點,要麼它有兩個子結點 如果乙個二叉樹的層數為k,且結點總數是 2k 12 k 1 2k 1 則它就是滿二叉樹。若設二叉樹的深度為k,除第 k 層外,其它各層 1 k 1 的結點數都達到最大個數,第k 層所有的結點都連續集中在最左邊,這就是完全二叉樹。它或者是一顆空樹,或...
滿二叉樹 完全二叉樹 平衡二叉樹 最優二叉樹
一 滿二叉樹 一棵二叉樹的結點要麼是葉子結點,要麼它有兩個子結點 如果乙個二叉樹的層數為k,且結點總數是 2 k 1,則它就是滿二叉樹。二 完全二叉樹 若設二叉樹的深度為k,除第 k 層外,其它各層 1 k 1 的結點數都達到最大個數,第k 層所有的結點都連續集中在最左邊,這就是完全二叉樹。三 平衡...