1. //编码
    #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<fstream>
  8. #include<map>
  9. using namespace std;
  10.  
  11. typedef struct HuffmanNode{
  12. int w;//节点的权值
  13. int ld, rd;//左右孩子节点
  14. int p;//父节点
  15. char ch;//当前节点的字符
  16. HuffmanNode(){
  17. ld = rd = p = -;
  18. }
  19. }huffmanNode, *pHuffmanNode;
  20.  
  21. typedef pair<int, int> pii;//haffuman节点和它的编号
  22.  
  23. bool operator > (pii x, pii y){
  24. return x.first > y.first;
  25. }
  26.  
  27. struct Huffman{
  28. int cntNode;//总结点的个数
  29. string orgCode;
  30. string huffmanCode;
  31. pHuffmanNode huffman = NULL;
  32. priority_queue<pii, vector<pii>, greater<pii> >qNode;
  33. map<string, char> huffmanMapx;//哈夫曼编码对应字符
  34. map<char, string> huffmanMapy;//字符对应哈夫曼编码
  35. void initHuffman(char *str){
  36. orgCode = str;
  37. cntNode = ;
  38. int cnt[];//统计每一个节点的个数
  39. memset(cnt, , sizeof(cnt));
  40. for(int i=; str[i]; ++i){
  41. if(cnt[str[i]]==) ++cntNode;
  42. ++cnt[str[i]];
  43. }
  44. huffman = new HuffmanNode[*(cntNode)];
  45. int index = ;
  46. for(int i=; i<; ++i){
  47. if(cnt[i]!=){
  48. huffman[index].w = cnt[i];
  49. huffman[index].ch = i;
  50. qNode.push(make_pair(huffman[index].w, index));
  51. ++index;
  52. }
  53. }
  54. while(qNode.size()>=) {
  55. pii ldPii = qNode.top();
  56. qNode.pop();
  57. pii rdPii = qNode.top();
  58. qNode.pop();
  59. huffman[index].w = ldPii.first + rdPii.first;
  60. huffman[index].ld = ldPii.second;
  61. huffman[index].rd = rdPii.second;
  62. huffman[ldPii.second].p = index;
  63. huffman[rdPii.second].p = index;
  64. qNode.push(make_pair(huffman[index].w, index));
  65. ++index;
  66. }
  67. }
  68.  
  69. void huffmanCoding() {
  70. for(int i=; i<cntNode; ++i){//从每一个孩子节点向上寻找
  71. string code = "";
  72. for(int child=i, p=huffman[child].p; ~p; child = p, p = huffman[child].p) {
  73. if(huffman[p].ld == child){//左子树
  74. code += '';
  75. } else if(huffman[p].rd == child){//右子树
  76. code += '';
  77. }
  78. }
  79. reverse(code.begin(), code.end());
  80. huffmanMapx.insert(make_pair(code, huffman[i].ch));
  81. huffmanMapy.insert(make_pair(huffman[i].ch, code));
  82. }
  83. }
  84.  
  85. void outHuffmanTree(fstream &fout, int f){
  86. if(huffman[f].ld==- && huffman[f].rd==-){
  87. fout<<<<" ";
  88. return ;
  89. } else {
  90. fout<<<<" ";
  91. outHuffmanTree(fout, huffman[f].ld);
  92. outHuffmanTree(fout, huffman[f].rd);
  93. }
  94. }
  95.  
  96. void outHuffmanCode(){
  97. huffmanCode = "";//存储字符串的哈夫曼编码之后的内容
  98. fstream fout("out.txt", ios_base::out);
  99. for(int i=; i<orgCode.length(); ++i){
  100. huffmanCode += huffmanMapy[orgCode[i]];
  101. }
  102. cout<<huffmanCode<<endl;
  103. fout<<huffmanCode<<endl;//想文件中输入huffman编码
  104. int f = *cntNode-;//huffman树的父节点
  105. outHuffmanTree(fout, f);
  106. fout<<endl;
  107. for(map<string, char>::iterator it = huffmanMapx.begin(); it!=huffmanMapx.end(); ++it){
  108. cout<<it->first << " -> " << it->second<<endl;
  109. fout<<it->first<<" "<<it->second<<endl; //向文件中输入HuffmanMap
  110. }
  111. }
  112. };
  113.  
  114. int main(){
  115. char str[];
  116. Huffman huffman;
  117. gets(str);
  118. huffman.initHuffman(str);
  119. huffman.huffmanCoding();
  120. huffman.outHuffmanCode();
  121. return ;
  122. }
  1. //译码
    #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<fstream>
  8. #include<map>
  9. using namespace std;
  10.  
  11. typedef struct HuffmanTreeNode{
  12. HuffmanTreeNode *ld, *rd;
  13. HuffmanTreeNode(){
  14. ld = NULL;
  15. rd = NULL;
  16. }
  17. } *pHuffmanTreeNode;
  18.  
  19. struct Huffman{
  20. pHuffmanTreeNode T;
  21. string code;
  22. map<string, char>huffmanMapx;
  23.  
  24. void buildT(fstream &fin, pHuffmanTreeNode &T){
  25. int w;
  26. fin>>w;
  27. T = new HuffmanTreeNode();
  28. if(w==)
  29. return ;
  30. buildT(fin, T->ld);
  31. buildT(fin, T->rd);
  32. }
  33.  
  34. void outT(pHuffmanTreeNode T){
  35. if(T->ld != NULL){
  36. cout<<<<endl;
  37. outT(T->ld);
  38. }
  39. else return;
  40. if(T->rd != NULL){
  41. cout<<<<endl;
  42. outT(T->rd);
  43. }
  44. }
  45.  
  46. void initHuffmanTree(){
  47. fstream fin("in.txt", ios_base::in);
  48. T = NULL;
  49. fin>>code;
  50. buildT(fin, T);
  51. //outT(T);
  52. string mapContent;
  53. while(getline(fin, mapContent)){
  54. int index = mapContent.find_first_of(' ');
  55. huffmanMapx.insert(make_pair(mapContent.substr(, index), mapContent[index+]));
  56. }
  57. }
  58.  
  59. void outHuffmanEncode(){
  60. string encode = "", cd="";
  61. initHuffmanTree();
  62. pHuffmanTreeNode p = T;
  63. for(int i=; i<code.length(); ++i){
  64. if(p->ld==NULL && p->rd==NULL){
  65. encode+=huffmanMapx[cd];
  66. cd="";
  67. --i;
  68. p=T;
  69. } else {
  70. cd+=code[i];
  71. if(code[i]=='')
  72. p=p->ld;
  73. else if(code[i]=='')
  74. p=p->rd;
  75. }
  76. if(i==code.length()-) encode+=huffmanMapx[cd];
  77. }
  78. cout<<encode<<endl;
  79. }
  80. };
  81.  
  82. int main(){
  83. Huffman huffman;
  84. huffman.outHuffmanEncode();
  85. return ;
  86. }

操作流程:

文本内容:aaaaaaabbbbbccdddd, and I am a student, my name is hjzgg!

1.首先利用''编码"工具将文本编码,会输出一个out.txt的文本,将out.txt文本中的内容发送给你的好友。

2.接受到out.txt文本的内容后,将内容复制到文本名为in.txt的文件中,利用"译码"工具(保证in.txt和译码工具在同一目录下)可以查看文本内容。

3.其中out.txt文本的格式如下:

Huffman树进行编码和译码的更多相关文章

  1. Huffman树的编码译码

    上个学期做的课程设计,关于Huffman树的编码译码. 要求: 输入Huffman树各个叶结点的字符和权值,建立Huffman树并执行编码操作 输入一行仅由01组成的电文字符串,根据建立的Huffma ...

  2. Huffman树与编码

    带权路径最小的二叉树称为最优二叉树或Huffman(哈夫曼树). Huffman树的构造 将节点的权值存入数组中,由数组开始构造Huffman树.初始化指针数组,指针指向含有权值的孤立节点. b = ...

  3. Huffman树与编码的简单实现

    好久没写代码了,这个是一个朋友问的要C实现,由于不会C,就用JAVA写了个简单的.注释掉的代码属性按照原来朋友发的题里带的参数,发现没什么用就给注释掉了. package other; import ...

  4. Huffman树及其编码(STL array实现)

    这篇随笔主要是Huffman编码,构建哈夫曼树有各种各样的实现方法,如优先队列,数组构成的树等,但本质都是堆. 这里我用数组来存储数据,以堆的思想来构建一个哈弗曼树,并存入vector中,进而实现哈夫 ...

  5. Huffman树及其编解码

    Huffman树--编解码 介绍:   Huffman树可以根据输入的字符串中某个字符出现的次数来给某个字符设定一个权值,然后可以根据权值的大小给一个给定的字符串编码,或者对一串编码进行解码,可以用于 ...

  6. 构造数列Huffman树总耗费_蓝桥杯

    快排! /** 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的 ...

  7. Java蓝桥杯练习题——Huffman树

    Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 找到{pi}中 ...

  8. Huffman树的构造及编码与译码的实现

    哈夫曼树介绍 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数) ...

  9. C++哈夫曼树编码和译码的实现

    一.背景介绍: 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的 ...

随机推荐

  1. Errors occurred during the build. Errors running builder 'JavaScript Validator' on project

    1.问题:Errors occurred during the build. Errors running builder 'JavaScript Validator' on project 2.解决 ...

  2. 简单C#、asp.net mvc验证码的实现

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Text;u ...

  3. maven整理——初步

    最近用到了maven,查找了很多资料,写这篇博文是为了记录maven的使用学习,也方便自己日后好查找. 在这里引用http://www.cnblogs.com/dcba1112/archive/201 ...

  4. 4_jquery

    官网:www.jquery.com 兼容: 1.jquery-3.1.0.js :form.attr("checked","false")无效 2.firefo ...

  5. About_Smarty

    Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一.它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码 ...

  6. “LC.exe”错误

    错误“LC.exe”已退出,代码为 -1. 可能的原因是: 这个第三方组件是个商业组件,他在组件的主使用类定义了 LicenseProvider(typeof(LicFileLicenseProvid ...

  7. webstorm快捷键

    webstorm应该是目前最强的js编辑器了,结合sublime text可以很效率的开发项目.今天整理了一些webstorm比较实用的快捷键: Ctrl+/ 或 Ctrl+Shift+/ 注释(// ...

  8. 百度Ueditor配置问题

    var URL = window.UEDITOR_HOME_URL || getUEBasePath(); 在ueditor.config.js中这一句是配置编辑器的网站根目录位置的,建议不要改,网上 ...

  9. AndroidStudio错误总结及解决(待续)

    AndroidStudio错误总结及解决 一. 当安装好AndroidStudio开启的时候出现如下错误: 百度的解决方法: 1)进入刚安装的Android Studio目录下的bin目录.找到ide ...

  10. js判断地址转向

    <script type="text/javascript"> if (navigator.userAgent.search(/iphone|ipod|ipad|And ...