解决立即给分!!!!!

zc_0702 2003-06-17 06:53:41
在一份电文中共使用5种字符:A,B,C,D,E,它们在电文中出现的频率分别为4,7,5,2,9。试通过构造最优化二叉树(要求左子树根结点的权值小于右子树根结点的权值)来确定每种字符的哈夫曼编码。
...全文
29 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
soniczhm 2003-06-17
  • 打赏
  • 举报
回复
27
11 16
5(C) 6 7(B) 9(E)
2(D) 4(A)
xiaolongleee 2003-06-17
  • 打赏
  • 举报
回复
// huffman.cpp : 定义控制台应用程序的入口点。
//vs.net通过

#include "stdafx.h"
#define MAX 21

typedef struct
{
char data;
int weight;
int parent;
int left;
int right;
}Huffcode;

typedef struct
{
char cd[MAX];
int start;
}code;

int _tmain(int argc, _TCHAR* argv[])
{
Huffcode ht[2*MAX];
code hcd[MAX],d;
int i,k,f,l,r,n,c,m1,m2;

printf("元素个数:");
scanf("%d",&n);

for(i=1; i<=n; i++)
{
getchar();
printf("第%d个元素=>\n\t结点值:",i);
scanf("%c",&ht[i].data);
printf("\t权重:");
scanf("%d",&ht[i].weight);
}

for(i=1; i<=2*n-1; i++)
{
ht[i].parent = 0;
ht[i].left = 0;
ht[i].right = 0;
}

for(i=n+1; i<=2*n-1; i++)
{
m1 = m2 = 300;
l = r = 0;
for(k=1; k<=i-1; k++)
{
if(ht[k].parent == 0)
{
if(ht[k].weight < m1)
{
m2 = m1;
r = l;
m1 = ht[k].weight;
l = k;
}
else if(ht[k].weight < m2)
{
m2 = ht[k].weight;
r = k;
}
}
}

ht[l].parent = i;
ht[r].parent = i;
ht[i].weight = ht[l].weight + ht[r].weight;
ht[i].left = l;
ht[i].right = r;
}

for(i=1; i<=n; i++)
{
d.start = n+1;
c = i;
f = ht[i].parent;

while(f != 0)
{
if(ht[f].left == c)
{
d.cd[--d.start] = '0';
}
else
{
d.cd[--d.start] = '1';
}

c = f;
f = ht[f].parent;
}
hcd[i] = d;
}

printf("输出huffman编码:\n");

for(i=1; i<=n; i++)
{
printf("%c:",ht[i].data);

for(k=hcd[i].start; k<=n; k++)
{
printf("%c",hcd[i].cd[k]);
}
printf("\n");
}

return 0;
}
Alicky 2003-06-17
  • 打赏
  • 举报
回复
UP
ilmlb 2003-06-17
  • 打赏
  • 举报
回复
up
zteliubin 2003-06-17
  • 打赏
  • 举报
回复
用程序计算吗,要花一点时间,结果应该是:
E
C B
D A

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧