8609 哈夫曼树

时间限制:1000MS 代码长度限制:10KB
提交次数:3178 通过次数:1263

题型: 编程题 语言: G++;GCC
Description 利用静态链表建立赫夫曼树,建树过程中要求左子树权值小于右子树权值,求各结点的编码。要求:叶子结点的个数n及结点值由键盘录入。本题给出程序代码,要求修改以满足测试要求.
#include “stdio.h”
#include “malloc.h”
#include “string.h”
typedef struct{
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
void Select(HuffmanTree &HT, int n, int &s1, int &s2)
//在HT[1…n]中选择parent为0且weight最小的两个结点,
// 其序号分别为s1和s2。
{
int i;
s1=-1;s2=-1;
for (i=1;i<=n;i++) {
if (HT[i].parent0)
if (s1-1) s1=i;
else
if (s2==-1 )
if (HT[i].weight0),构造哈夫曼树HT,
// 并求出n个字符的哈夫曼编码HC
int i, j, m, s1, s2, start;
char *cd;
unsigned int c, f;
if (n<=1) return;
m = 2 * n - 1;
HT = (HuffmanTree)malloc((m+1) * sizeof(HTNode)); // 0号单元未用
for (i=1; i<=n; i++) { //初始化
HT[i].weight=w[i-1];
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for (i=n+1; i<=m; i++) { //初始化
HT[i].weight=0;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
printf("\n哈夫曼树的构造过程如下所示:\n");
printf(“HT初态:\n 结点 weight parent lchild rchild”);
for (i=1; i<=m; i++)
printf("\n%4d%8d%8d%8d%8d",i,HT[i].weight,
HT[i].parent,HT[i].lchild, HT[i].rchild);
printf(" 按任意键,继续 …");
getch();
for (i=n+1; i<=m; i++) { // 建哈夫曼树
// 在HT[1…i-1]中选择parent为0且weight最小的两个结点,
// 其序号分别为s1和s2。
Select(HT, i-1, s1, s2);
HT[s1].parent = i; HT[s2].parent = i;
HT[i].lchild = s1; HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
printf("\nselect: s1=%d s2=%d\n", s1, s2);
printf(" 结点 weight parent lchild rchild");
for (j=1; j<=i; j++)
printf("\n%4d%8d%8d%8d%8d",j,HT[j].weight,HT[j].parent,HT[j].lchild, HT[j].rchild);
printf(" 按任意键,继续 …");
getch();
}
//— 从叶子到根逆向求每个字符的哈夫曼编码 —
cd = (char )malloc(nsizeof(char)); // 分配求编码的工作空间
cd[n-1] = ‘\0’; // 编码结束符。
for (i=1; i<=n; ++i) { // 逐个字符求哈夫曼编码
start = n-1; // 编码结束符位置
for (c=i, f=HT[i].parent; f!=0; c=f, f=HT[f].parent)
// 从叶子到根逆向求编码
if (HT[f].lchild==c) cd[–start] = ‘0’;
else cd[–start] = ‘1’;
HC[i] = (char *)malloc((n-start)*sizeof(char));
// 为第i个字符编码分配空间
strcpy(HC[i], &cd[start]); // 从cd复制编码(串)到HC

}
free(cd); //释放工作空间
} //HuffmanCoding

void main()
{
int i,n;
int *w;
HuffmanTree HT;
HuffmanCode HC;
printf(“Node Number:”);
scanf("%d",&n); //权值个数
w=(int )malloc(nsizeof(int));
printf(“Input weights:”);
for ( i=0;i<n;i++) //录入权值
scanf("%d",&w[i]);

HC=(char **)malloc((n+1)sizeof(char)); //0空间未用
HT=(HuffmanTree)malloc((2*n+1+1)*sizeof(HTNode));//0空间未用
HuffmanCoding(HT, HC, w, n);
printf("\n");
for (i = 1; i<n+1; i++){
puts(HC[i]); //输出哈夫曼编码
free(HC[i]); //释放空间
}
free(HC);
free(HT);
}//main

输入格式
第一行:权值个数
第二行:输入n个权值,用空格分隔

输出格式
输出n行
每行表示各权值对应的哈夫曼编码

输入样例
8
5 29 7 8 14 23 3 11

输出样例
0001
10
1110
1111
110
01
0000
001

总结

这题就是改下Select函数,和删掉print
Select函数怎么写呢,首先最简单的方法就是用两个for循环来写,像冒泡排序一样,但是既然题目给了另一种方法,那就用题目的方法来写吧。
这样写的话就是一次for循环就能找到最小的两个结点。

#include "cstdio"
#include "cstdlib"
#include "cstring"
typedef struct{unsigned int weight;unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
void   Select(HuffmanTree &HT, int n, int &s1, int &s2)
//在HT[1..n]中选择parent为0且weight最小的两个结点,
// 其序号分别为s1和s2。
{//这里默认就是HT[s1].weight<HT[s2].weightint i;s1=-1;s2=-1;for (i=1; i<=n; i++) {if (HT[i].parent == 0) {if (s1 == -1)//当第一次执行的时候赋值给s1s1 = i;else if (HT[s1].weight > HT[i].weight) {s2 = s1;s1 = i;}else if (s2 == -1)s2 = i;else if (HT[s2].weight > HT[i].weight)s2 = i;}}}void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n) {  // 并求出n个字符的哈夫曼编码HCint i, j, m, s1, s2, start;char *cd;unsigned int c, f;if (n <= 1) return;m = 2 * n - 1;HT = (HuffmanTree) malloc((m + 1) * sizeof(HTNode));  // 0号单元未用for (i = 1; i <= n; i++) { //初始化HT[i].weight = w[i - 1];HT[i].parent = 0;HT[i].lchild = 0;HT[i].rchild = 0;}for (i = n + 1; i <= m; i++) { //初始化HT[i].weight = 0;HT[i].parent = 0;HT[i].lchild = 0;HT[i].rchild = 0;}for (i = n + 1; i <= m; i++) {  // 建哈夫曼树// 在HT[1..i-1]中选择parent为0且weight最小的两个结点,// 其序号分别为s1和s2。Select(HT, i - 1, s1, s2);HT[s1].parent = i;HT[s2].parent = i;HT[i].lchild = s1;HT[i].rchild = s2;HT[i].weight = HT[s1].weight + HT[s2].weight;}//--- 从叶子到根逆向求每个字符的哈夫曼编码 ---cd = (char *) malloc(n * sizeof(char));    // 分配求编码的工作空间cd[n - 1] = '\0';                         // 编码结束符。for (i = 1; i <= n; ++i) {                  // 逐个字符求哈夫曼编码start = n - 1;                          // 编码结束符位置for (c = i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent)// 从叶子到根逆向求编码if (HT[f].lchild == c) cd[--start] = '0';else cd[--start] = '1';HC[i] = (char *) malloc((n - start) * sizeof(char));// 为第i个字符编码分配空间strcpy(HC[i], &cd[start]);    // 从cd复制编码(串)到HC}free(cd);   //释放工作空间} //HuffmanCodingint main(){int i,n;int *w;HuffmanTree HT;HuffmanCode HC;scanf("%d",&n);  //权值个数w=(int *)malloc(n*sizeof(int));for ( i=0;i<n;i++)  //录入权值scanf("%d",&w[i]);HC=(char **)malloc((n+1)*sizeof(char*)); //0空间未用HT=(HuffmanTree)malloc((2*n+1+1)*sizeof(HTNode));//0空间未用HuffmanCoding(HT, HC, w, n);for (i = 1; i<n+1; i++){puts(HC[i]);  //输出哈夫曼编码free(HC[i]);  //释放空间}free(HC);free(HT);}//main

SCAU 8609 哈夫曼树相关推荐

  1. Python---哈夫曼树---Huffman Tree

    今天要讲的是天才哈夫曼的哈夫曼编码,这是树形数据结构的一个典型应用. !!!敲黑板!!!哈夫曼树的构建以及编码方式将是我们的学习重点. 老方式,代码+解释,手把手教你Python完成哈夫曼编码的全过程 ...

  2. 优先级队列实现哈夫曼树的编码和译码

    //优先级队列实现的哈夫曼树的编码和译码 #include<iostream> #include<queue> #include<string> using nam ...

  3. HDU1053 Entropy 哈夫曼树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1053 认真读题,别怕题长,此题考查的就是哈夫曼树并求出最小编码值,注意每一次要将数组清0,否则会出错! ...

  4. 数据结构与算法(6-5)二叉树的应用--哈夫曼树与哈夫曼编码

    目录 哈夫曼编码(最优二叉树) 一.优势:缩短电文长度 二.思想: 三.过程: 四.图解实现过程: 五.总代码 哈夫曼编码(最优二叉树) 一.优势:缩短电文长度 二.思想: 获取每个字符出现的频率,用 ...

  5. java振动数据压缩_【数据结构-Java】最佳实践-数据压缩(使用赫夫曼树)

    一.需求 将给出的一段文本,比如 "i like like like java do you like a java" , 根据前面的讲的赫夫曼编码原理,对其进行数据压缩处理 二. ...

  6. 哈夫曼树的java实现_java实现哈夫曼树

    哈夫曼译码,就是将输入的译码还原成对应的字符. 抽象的算法描述:将建立哈夫曼树.实现哈夫曼编码.哈夫曼译码都定义成 子函数的的形式, 然后在主函数中调用它们...... 数据结构课程设计设计题目: 哈 ...

  7. 哈夫曼树的生成及哈夫曼编码

    首先构造哈夫曼树结构体,初始化哈夫曼树的四个无符号整型域,输入文本,统计各个字符的权值,然后构建哈夫曼树,从根到叶子逆向求哈夫曼树的编码. #include"stdio.h" #i ...

  8. 赫夫曼编码(基于赫夫曼树的实现)

    上一篇文章中我们探讨了赫夫曼树的基本原理和构造方式,而赫夫曼编码可以很有效地压缩数据(通常可以节约20%-90%的空间,具体压缩率依赖于数据的特性). 名词:定长编码,边长编码,前缀码(装B用的) 定 ...

  9. 赫夫曼树(哈夫曼树)

    赫夫曼树->赫夫曼编码 在数据膨胀.信息爆炸的今天,数据压缩的意义不言而喻. 一个字节8位 赫夫曼编码压缩-无损压缩 可以看成成绩的排布.成绩是70-90之间占有70%,所以以下两个数据结构优化 ...

最新文章

  1. Linux下gdb attach的使用(调试已在运行的进程)
  2. 保Cloudera弃Hortonworks,新平台将支持五大云供应商
  3. 客户资产管理(Custom Asset Management)
  4. 本机发邮件测试mail函数
  5. 错误信息 c语言实现_全国计算机等级考试二级C语言
  6. 只要200行JavaScript代码,就能把特斯拉汽车带到您身边
  7. python常用库有哪些餐厅_Python常用库整理
  8. springboot entity date_「Java」 - SpringBoot amp; JPA多数据源
  9. 字符串String的trim()方法
  10. [转]Python爬虫html解析工具beautifulSoup在pycharm中安装及失败的解决办法
  11. 游戏工委:已有63家单位响应防止未成年人沉迷通知
  12. go语言 字符串处理
  13. 微信支付金额为0.01分报错,和少一分钱的解决办法
  14. web前端顶岗实习总结报告_web前端实习报告
  15. 英语不好学计算机特长,指导:英语学不好,是因为你没养成这些好习惯
  16. 何谓赛道思维?隔壁阿三加密货币赛道重启,我们何时迎头赶上?
  17. 不再犹豫用计算机,电脑固态硬盘接口该怎么选?3选1不再犹豫
  18. win10注册mscomm32.ocx失败
  19. 大数据批量下载文件 代码
  20. ROS1云课→01简介和配置

热门文章

  1. 解决安装PHP 5.6.40版本途中坑坑洼洼
  2. SDM660 xbl阶段使能I2C 设备实现
  3. iis php mysql wiki_如何创建自己的wiki-Dokuwiki
  4. 阿里云 短信服务——短信发送频率限制
  5. Mac ssh远程登录腾讯云的解决方案
  6. php生成免签转账码,(转)支付宝免签二维收款码生成
  7. 【TensorFlow基础】
  8. Typora Syntax
  9. 评四女作家的×龙戏凤 (原版)
  10. 保健用品智慧供应链管理系统:精细化管理供应商与采购环节,打造敏捷型供应链