資源簡介
本程序是c++語言利用數據結構中的樹來實現二院哈夫曼編譯碼,支持任意字符串的編譯碼,直接用visual studio打開運行即可。
代碼片段和文件信息
#include?
#include?
using?namespace?std;
struct?HNode?
{
int?weight;??? //結點權值
??? int?parent;??? //雙親指針
int?LChild;?? //左孩子指針
int?RChild?;? //右孩子指針
};????
struct?HCode
??{
char?data;
char?code[100];
??};
class?Huffman
{
private:
????HNode*?HTree;????????????????????//Huffman樹??
HCode*?HCodeTable;???????????????//Huffman編碼表
char?str[1024];??????????????????//輸入的原始字符串
char?leaf[256];??????????????????//葉子節點對應的字符
int??a[256];?????????????????????//記錄每個出現的字符的個數
public:
????int??n;??????????????????????????//葉子節點數
????void?init();?????????????????????//初始化
????void?CreateHTree();?????? ?//創建huffman樹
????void?CreateCodeTable();? ?//創建編碼表
????void?Encode(char?*d);????????????//編碼
void?Decode(char?*s?char?*d);???//解碼
void?print(int?iint?m);?????????//打印Huffman樹
void?SelectMin(int?&x?int?&y?int?s?int?e?);//選擇兩個最小的節點
void?Reverse(char*?s);?//逆轉編碼
????~?Huffman();//析構函數
};
void?Huffman::init()
{
int?nNum[256]=?{0};????????????????//記錄每一個字符出現的次數
int?ch?=?cin.get();??
int?i=0;??
while((ch!=‘\r‘)?&&?(ch!=‘\n‘))
{
nNum[ch]++;???????????????????//統計字符出現的次數
str[i++]?=?ch;???????????????????//記錄原始字符串
ch?=?cin.get();???????????????????//讀取下一個字符
}
str[i]=‘\0‘;
cout<<“各個字符出現的次數:“< ????n?=?0;
????for?(?i=0;i<256;i++)
{
if?(nNum[i]>0)??????????????//若nNum[i]==0說明該字符未出現
{
leaf[n]?=?(char)i;?????????
a[n]?=?nNum[i];???
n++;
cout<<(char)i<<“-“< }
}
cout< }
void?Huffman::CreateHTree()
{
HTree?=?new?HNode?[2*n-1];? //根據權重數組a[0..n-1]?初始化Huffman樹
for?(int?k?=?0;?k? {
HTree[k].weight?=?a[k];
HTree[k].LChild?=?HTree[k].RChild?=?HTree[k].parent?=?-1;
}
??? int?x?y;
??? for?(int?i?=?n;?i?2*n-1;?i++) ?//開始建Huffman樹
{???
SelectMin(x?y?0?i);? ?//從1~i中選出兩個權值最小的結點
HTree[x].parent?=?HTree[y].parent?=?i;
HTree[i].weight?=?HTree[x].weight+?HTree[y].weight;
HTree[i].LChild?=?x;
HTree[i].RChild?=?y;
HTree[i].parent?=?-1;
}
}
void?Huffman::SelectMin(int?&x?int?&y?int?s?int?e?)
{
int?i;
for?(?i=s;?i<=e;i++)
if?(HTree[i].parent?==?-1)
{
x?=y=?i;????break;??????????//找出第一個有效權值x,并令y=x
}
????for?(?;?i if?(HTree[i].parent?==?-1)?????????//該權值未使用過
{
if?(?HTree[i].weight????????????{
評論
共有 條評論