6-1 哈夫曼树及哈夫曼编码
6-1 哈夫曼树及哈夫曼编码 (10 分)
函数SelectTwoMin(int upbound, HuffmanTree HT, int &s1, int &s2)是从1到upbound中找出father为0的节点赋给s1,s2,(为了保证答案唯一,请让s1的节点编号小于s2),函数HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n)是构造哈夫曼树以及计算哈夫曼编码。保证输入的权重值小于1000。
函数接口定义:
void SelectTwoMin(int upbound, HuffmanTree HT, int &s1, int &s2);
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n);
其中 upbound 编号,HT是哈夫曼树,HC是哈夫曼编码,w是权值,n是叶子节点个数。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int weight;
int parent;
int lchild;
int rchild;
} HTNode, *HuffmanTree;
typedef char ** HuffmanCode;
void SelectTwoMin(int upbound, HuffmanTree HT, int &s1, int &s2);
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n);
int main() {
HuffmanTree ht;
HuffmanCode hc;
int n;
scanf("%d", &n);int *w = (int *) malloc (n * sizeof(int));
for(int i = 0; i < n; ++ i)scanf("%d", &w[i]);HuffmanCoding(ht, hc, w, n);for (int i = 1; i <= 2 * n - 1; ++ i) {printf("%d %d %d %d\n", ht[i].weight, ht[i].parent, ht[i].lchild, ht[i].rchild);
}for (int i = 1; i <= n; ++ i)printf("%s\n", hc[i]);free(w);
free(ht);
for (int i = 1; i <= n; ++ i)free(hc[i]);return 0;
}
/* 你的代码将被嵌在这里 */
输入格式:
第一行输入一个数n,表示叶子节点的个数,接下去输入n个整数,表示每个节点的值
输出格式:
只要建树即可,输出已经确定了
输入样例:
4
1 2 3 4
输出样例:
1 5 0 0
2 5 0 0
3 6 0 0
4 7 0 0
3 6 1 2
6 7 3 5
10 0 4 6
110
111
10
0
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct {int weight;int parent;int lchild;int rchild;
} HTNode, *HuffmanTree;
typedef char ** HuffmanCode;void SelectTwoMin(int upbound, HuffmanTree HT, int &s1, int &s2);
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n);void reverse(char *CH)
{int n=strlen(CH);int i;for (i=0; i<n/2;i++){char temp;temp = CH[i];CH[i] = CH[n-i-1];CH[n-i-1] = temp;}
}int main() {HuffmanTree ht;HuffmanCode hc;int n;scanf("%d", &n);int *w = (int *) malloc (n * sizeof(int));for(int i = 0; i < n; ++ i)scanf("%d", &w[i]);HuffmanCoding(ht, hc, w, n);for (int i = 1; i <= 2 * n - 1; ++ i) {printf("%d %d %d %d\n", ht[i].weight, ht[i].parent, ht[i].lchild, ht[i].rchild);}for (int i = 1; i <= n; ++ i)printf("%s\n", hc[i]);free(w);free(ht);for (int i = 1; i <= n; ++ i)free(hc[i]);return 0;
}
//其中 upbound 编号,HT是哈夫曼树,HC是哈夫曼编码,w是权值,n是叶子节点个数
void SelectTwoMin(int upbound, HuffmanTree HT, int &s1, int &s2)
{int x1=0,x2=0;int m1= 1000;int m2= 1000;for(int i=1; i<=upbound; i++){if(HT[i].parent == 0&& HT[i].weight < m1){m2= m1;x2 = x1;m1 = HT[i].weight;x1 = i;}else if(HT[i].parent == 0 && HT[i].weight <m2){m2 = HT[i].weight;x2 = i;}}s1 = x1;s2 = x2;
}
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n)
{int s1=0;int s2=0;HT = (HuffmanTree)malloc(sizeof(HTNode)*(2*n));HC = (char **)malloc(sizeof(char *)*(n+1));for(int i=1;i<=n;i++){HC[i] = (char *)malloc(sizeof(char)*(n+1));memset(HC[i],0,sizeof(char)*(n+1));}for (int i = 0; i <n ; ++i) {HT[i+1].weight = w[i];}//给结构体赋值for(int i=1;i<=2*n-1;i++){HT[i].parent = 0;HT[i].lchild = 0;HT[i].rchild = 0;}for (int i = 0; i <n-1 ; ++i) {SelectTwoMin(n+i,HT,s1,s2);HT[i+n+1].lchild = s1;HT[i+n+1].rchild = s2;HT[i+n+1].weight = HT[s1].weight+HT[s2].weight;HT[s1].parent = i+n+1;HT[s2].parent = i+n+1;}//for (int i = 1; i <= n ; ++i) {int c = i;int parent = HT[c].parent;while (parent!=0){if(HT[parent].lchild==c){strncat(HC[i],"0",1);}elsestrncat(HC[i],"1",1);c = parent;parent = HT[parent].parent;}reverse(HC[i]);}
}
输出样例:
该代码随难度不大到有很多细节需要注意:
- 初始化叶节点以及非叶节点使他们的父亲结点儿子结点全部初始化为0.
- 申请字符串数组内存注意形式。
- 在申请过程中要保证每一个字符串都应该被初始化否则会出现乱码(亲测)。
- 注意得到的哈夫曼编码是从叶节点到根结点,需要将它逆序。
6-1 哈夫曼树及哈夫曼编码相关推荐
- 蓝桥哈夫曼树C语言,实验四 哈夫曼树及哈夫曼编码
实验目的## 掌握哈夫曼树的概念.哈夫曼编码及其应用. 掌握生成哈夫曼树的算法. 会用哈夫曼树对传输报文进行编码. 掌握二叉树的二叉链表存储方式及相应操作的实现. ##实验内容## 用哈夫曼编码进行通 ...
- python哈夫曼树_python霍夫曼树
class Node(): data=0 left=None right=None father=None def __init__(self,data,left,right): self.data= ...
- 一文看懂哈夫曼树与哈夫曼编码
转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299884.html 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUF ...
- 树:哈夫曼树和哈夫曼编码的详细介绍以及代码实现
闲扯前言 哈夫曼编码的代码实现对于初学数据结构的同学可能会有些困难,没有必要灰心,其实没啥,学习就犹如攀登一座又一座的山峰,每当我们攻克一个难点后,回首来看,也不过如此嘛.我们要做的就是不断的去攀越学 ...
- 听说你还不懂哈夫曼树和哈夫曼编码
基本概念 哈夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,在实际中有广泛的用途. 基本概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径. 路径长度:路径上的分 ...
- 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- 【Java数据结构与算法】第十二章 哈夫曼树和哈夫曼编码
第十二章 哈夫曼树和哈夫曼编码 文章目录 第十二章 哈夫曼树和哈夫曼编码 一.哈夫曼树 1.基本术语 2.构建思路 3.代码实现 三.哈夫曼编码 1.引入 2.介绍 3.代码实现哈夫曼编码综合案例 一 ...
- 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算
1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...
- 【数据结构】-哈夫曼树以及哈夫曼编码
哈夫曼树的几个定义 哈夫曼树又叫最优二叉树:特点是带权路径最短 带权路径长度:该结点到根结点的路径长度乘以该结点的权值. 树的带权路径长度(WPL):所有叶子结点到根结点的带全路径长度之和. 最优二叉 ...
- C++ 实现哈夫曼树和哈夫曼编码
C++ 实现哈夫曼树和哈夫曼编码 一.哈夫曼树的定义 二.哈夫曼树的构造算法 三.哈夫曼编码 四.哈夫曼算法实现 1.定义一个结点类 2.定义一个哈夫曼编码类 3.定义一个哈夫曼树类 4.设置初始值 ...
最新文章
- ubuntu18.04下双机驱动调试
- MySQL连接问题【如何解决MySQL连接超时关闭】
- CF1067E Random Forest Rank(树形dp,概率与期望,线性代数)
- C# 函数 传入 C++动态库中 做回调函数
- python嵩天第二版第五章_如何避免从入门到放弃——python小组学习复盘
- linux生产环境下安装anaconda总结
- 苹果推出36期免息分期?每月88元就能用上iPhone 13
- 苹果计算机怎么添加在快捷方式,如何在 iPhone 主屏幕上添加文件快捷方式?
- MYSQL-主键、外键
- Labview对mysql查询的数据进行展示
- Oracle10g下载地址--多平台下的32位和64位
- UVA 10002 Center of Masses
- mysql 系统变量_MySQL系统变量(查看和修改)
- window和Linux下安装JDK配置环境变量
- 04_部署 etcd 集群
- web网页设计实例作业 ——校园文化(7页) html大学生网站开发实践作业
- WAP,手机网站建站资料收集 - 老古董
- android源码中国地图,Android 绘制中国地图
- [读书]《罗辑思维》第一季、第二季推荐书籍清单
- 摹客 PS 插件,支持自定切图尺寸!
热门文章
- 结构化思维,让你的工作有条不紊
- 计算机系单身率排行榜,2020中国高校单身率排行榜出炉!附:单身率特别高的专业...
- RST 和 Markdown
- 「鸡蛋返生」美国早就在搞了好吧
- linux常用命令与问题排查命令记录
- matlab 矩阵 对称,如何使用Matlab产生对称矩阵
- 百度飞桨“万有引力”2022首站落地苏州,全面启动中小企业赋能计划
- postgres链接太多(sorry, too many clients already)
- js实现文字转语音功能tts
- 线上连锁线下整合的连锁电商架构 打造店店互推人人分销模式