哈夫曼树:
树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
任务描述:
- 从文件中读文本;
- 统计字符频次, 并建立字母表;
- 构造 Huffman 树;
- 将文本编码;
- 解码.
分析:
- parent, lchild, rchild 都用的是整数, 即下标. 也就是说, 先建立节点, 存放于一个数组 (线性表) 中, 再进行链接. 避免使用指针, 有静态链表的味道, good!
代码
#include#include #include using namespace std; #define MaxSize 1024 // 读入文件的上限 #define OK 1 #define ERROR 0 typedef int Status; typedef struct wordcnt{ // 统计字符和对应的次数 char ch; int cnt = 0; }Count; typedef struct NumCount{ // 统计次数的外部封装 Count count[MaxSize]; int length = 0; }NumCount; typedef struct HTree{ // 哈夫曼树结构 char data; int weight; int parent,lchild,rchild; }HTNode,*HuffmanTree; typedef struct HCode{ // 编码结构 char data; char* str; }*HuffmanCode; 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"< length;++j) { if(paraCnt->count[j].ch == data[i]) // 若已有记录,直接++ { ++paraCnt->count[j].cnt; flag = 1; break; } } if(!flag) // 没有记录,则新增 { paraCnt->count[paraCnt->length].ch = data[i]; ++paraCnt->count[paraCnt->length].cnt; ++paraCnt->length; } } return OK; } Status Show(NumCount *paraCnt) { cout<<"the length is "< length< length;++i) { cout<<"The character "< count[i].ch<<" appears "< count[i].cnt<


