哈夫曼树:给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
定义结构体:
typedef struct wordcnt{
//统计字符和对应的次数
char ch;
int cnt = 0;
};
typedef struct NumCount{
//统计次数的外部封装
Count count[MaxSize];
int length = 0;
};
typedef struct HTree{
//哈夫曼树结构
char data;
int weight;
int parent,lchild,rchild;
};
typedef struct HCode{
//编码结构 、树节点的编码
char data;
char*str;
};
函数解释:
Status ReadData(char *source);//读入文件
Status WordCount(char *data,NumCount *paraCnt);//统计次数
Status Show(NumCount *paraCnt);//展示次数
Status CreateHuffmanTree(HuffmanTree &HT,int length,NumCount cntarray);//创建哈夫曼树
Status select(HuffmanTree HT,int top,int *s1,int *s2);//选择权重最小的两个节点
Status CreateHuffmanCode(HuffmanTree HT,HuffmanCode &HC,int length);//创建哈夫曼编码
Status Encode(char *data,HuffmanCode HC, int length);//将读入的文件编码,写到txt文件
Status Decode(HuffmanTree HT,int length);//读入编码文件,解码
主要的运行部分:
int main(int argc, char** argv){
char data[MaxSize];
NumCount Cntarray;
ReadData(data);//读取数据
WordCount(data,&Cntarray);//统计次数
// Show(&Cntarray);//可以查看每个单词出现的对应次数
HUffmanTree tree;
CreateHuffmanTree(tree,Cntarray.length,Cntarray);//建树
HuffmanCode code;
CreateHuffmanCode(tree,code,Cntarray.length);//创建编码
Encode(data,code,Cntarray.length); //生成编码文件
Decode(tree,Cntarray.length);//解码
cout<<"please view the generated TXT file to check the result(请检查这个改变的TXT文件中的编码一边检查结果)"<<end1;
return 0;
}
读取数据:
void ReadData(char *source)
{
//打开文件读入数据
ifstream infile;
infile.open("in.txt");
cout<<"Reading..."<<endl;
cout<<"the input file