計算哈夫曼樹的wpl值 根據給定的n個權值(非負值),計算所構造哈夫曼樹的wpl值。
基本要求:
(1)根據給定的資料,建立哈夫曼樹;
(2)輸出每個葉子結點的帶權路徑長度;
(3)輸出哈夫曼樹的wpl值。
測試資料要求: 輸入的n個權值之和應為100,且不允許有負值。
#include #include #include #define n 5 //5個英文小寫字母(注意,該示例可擴充套件到所有可顯示字元,可自行新增改寫),此示例中字串僅允許包含小寫字母
//哈夫曼樹相關
//節點定義,使用陣列儲存鍊錶,指標使用位置索引
typedef struct htnode, *phtnode, *htree;
//編碼表
typedef char **hcode;
//輔助操作,從1到k中選擇兩個權重最小的節點
void select(htree ht, int k, int &s1, int &s2)
else if(ht[i].weight < smin)
} //使得s1小於s2,可使編碼較規範,盡量以0結束
int temp;
if(s1 > s2)
}//根據權重資料構建huffman樹
void constructhuffmantree(htree &ht, int *w)
for(; i <= m; i++)
//建立huffman樹
for(i = n + 1; i <= m; i++)
}//從huffman樹獲取編碼表
//從根到葉子(遞迴),cd儲存獲取的編碼記錄
void getcodetable(htree ht, hcode hc, int p, char *cd, int cdlen)
if(ht[p].lchild) //向左子樹前進
if(ht[p].rchild) //向右子樹前進
}//從葉子到根,教程演算法
void getcodetable1(htree ht, hcode &hc)
hc[i] = (char *)malloc((n - start) * sizeof(char));
strcpy(hc[i], cd + start);
} free(cd);}
//從根到葉子(非遞迴),教程演算法,這是模擬遞迴棧的一種典型方法,需注意
void getcodetable2(htree ht, hcode &hc)
//否則如果是葉子節點的話登記字元編碼(其實在右子樹那邊檢查也可以),否則會繼續遍歷右子樹
if(!ht[p].rchild)
continue;
} //如果左子樹已經訪問過而右子樹沒有訪問過
if(ht[p].weight == 1)
//其實在右子樹這邊登記也可以
/*else if(!ht[p].lchild)*/
continue;
} //如果左右兩個子樹都已經訪問過了,退回到雙親節點(同時重置訪問標誌,字元記錄位置也前移)
ht[p].weight = 0; --cdlen; p = ht[p].parent; }}
//輸出碼表
void printcodetable(hcode hc)
}//使用碼表對字串編碼
void encode(hcode hc, char *str, char **code)
}//對哈夫曼樹進行計算wpl
int wpl(hcode hc,int w);
for(int i = 1; i <= n; i++)
sum=sum+strlen(hc[i])*w[i];
return sum;
}int main()
; htree ht;
constructhuffmantree(ht, w); //構建huffman樹
//從樹中獲取編碼表
hcode hc = (hcode)malloc((n+1) * sizeof(char *));
char *cd = (char *)malloc(n * sizeof(char));
int cdlen = 0;
getcodetable(ht, hc, 2 * n - 1, cd, cdlen);
printcodetable(hc); //輸出編碼表
printf("wpl:%d\n",wpl(hc,w));
return 0;
}
資料結構 課程設計哈夫曼編碼
資料結構 課程設計哈夫曼編碼 資料結構實驗課程主要是討論計算機中資料的組織形式,資料之間的邏輯關係,資料的儲存以及各種運算的實現。通過本課程的講授與上級實踐使學生掌握各種型別的資料結構基本概念,邏輯結構與儲存結構,以及相關演算法的實現及應用,並能為各種儲存方式的應用設計相應的演算法,培養學生運用相關...
資料結構 哈夫曼樹 哈夫曼編碼
哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...
哈夫曼編碼 哈夫曼樹 (資料結構)
哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...