viency13 2023-05-15 12:41 采纳率: 68.8%
浏览 38
已结题

请问这段代码要怎么修改呢

哈夫曼编码
本题要求字符的哈夫曼编码,注意建立的哈夫曼树严格按照左小右次小的顺序,并且哈夫曼编码时严格按照左‘0’右‘1’进行编码。

输入格式:
输入是各个字符在通信中出现的频率

输出格式:
输出是各个字符的哈夫曼编码,每个字母占一行


输入样例:
A:2
B:3
C:6
D:7
E:10
F:19
G:21
H:32
输出样例:
A:10000
B:10001
C:1001
D:1010
E:1011
F:00
G:01
H:11


#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
#include<stack>
#include<vector>
#include<cstdlib>
using·namespace·std;
int·N·=·0;
const·int·maxn·=·1050000;
struct·HuffmTree{//哈弗曼树
····char·ch;
····double·value;
····HuffmTree·*left;
····HuffmTree·*right;
}tree[maxn];
map<string,char>m;
//词频升序排序
bool·Compare(HuffmTree·x,HuffmTree·y)
{
········return·x.value·<·y.value;
}
//创建哈弗曼树
HuffmTree*·BuildingTree(int·N)
{
····int·i·=·0,index·=·N·-·1;//i·=·0,表示从位置0开始合成,index是生成的节点放置的地方
····while(i·<·2*N-1){//while当i没走到最后一个节点就不会停止
········sort(tree+i,tree+index+1,Compare);//排序,找出词频小的两棵子树
········HuffmTree·*Node·=·&tree[i++];//拿出词频最小的两棵子树Node,Node2
········HuffmTree·*Node2·=·&tree[i++];
········HuffmTree·NewNode·=·tree[index];//中间节点
········NewNode.value·=·Node->value·+·Node2->value;//中间节点的权值等于左右节点的权值相加
········NewNode.ch·=·'.';//设置中间节点的标记
········NewNode.left·=·Node;//最小的两棵子树被当为左右子树
········NewNode.right·=·Node2;
········tree[++index]·=·NewNode;//把新生成的节点加入到结构体数组中
····}
····return·&tree[index-1];//返回根节点
}
打印各字符的编码
void·PrintCoding(HuffmTree·*root,char·coding[],int·index)
{
····if(!root)·return;//空树返回
····if(root->ch·!=·'.'){//如果是叶子节点
········printf("%c:",root->ch);
········string·str·=·"";
········for(int·i·=·0;i·<·index;i++){//打印出该字符的编码
············printf("%d",coding[i]);
············str·+=·to_string(coding[i]);
········}
········printf("\n");
········m[str]·=·root->ch;
····}
····coding[index]·=·0;//左子树设置为0
····index++;//下一个节点
····PrintCoding(root->left,coding,index);//递归访问该节点
····index--;//该节点递归完成,取消该节点的记录
····coding[index]·=·1;
····index++;//下一个节点
····PrintCoding(root->right,coding,index);//递归访问该节点
····index--;//该节点递归完成,取消该节点的记录
}
int·main()
{
····char·c;
····int·i·=·0;
····while·(·scanf("%c%c%lf",&tree[i].ch,·&c,·&tree[i].value)·!=·EOF·)
····{//输入字符和相应的词频
········N·++;
········tree[i].left·=·NULL;//左右子树为空子树
········tree[i].right·=·NULL;
········getchar();
········i·++;
····}
····string·decoding;//输入需进行译码的串
····cin>>decoding;
····HuffmTree·*root·=·(HuffmTree*)malloc(sizeof(HuffmTree));
····root·=·BuildingTree(N);//建树
····char·coding[1050]·=·{};//编码字符串,初始化为0
····PrintCoding(root,coding,0);//打印各字符的编码
····return·0;
}


  • 写回答

1条回答 默认 最新

报告相同问题?

问题事件

  • 系统已结题 8月28日
  • 已采纳回答 8月20日
  • 创建了问题 5月15日

悬赏问题

  • ¥15 淘宝自动下单XPath自动点击插件无法点击特定<span>元素,如何解决?
  • ¥15 曙光1620-g30服务器安装硬盘后 看不到硬盘
  • ¥15 抖音直播广场scheme
  • ¥15 为什么我明明有这个文件调试器还显示错误?
  • ¥15 软件工程用例图的建立(相关搜索:软件工程用例图|画图)
  • ¥15 如何在arcgis中导出拓扑关系表
  • ¥15 处理数据集文本挖掘代码
  • ¥15 matlab2017
  • ¥15 在vxWorks下TCP/IP编程,总是connect()报错,连接服务器失败: errno = 0x41
  • ¥15 AnolisOs7.9如何安装 Qt_5.14.2的运行库