哈夫曼树及哈夫曼编码(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

代码

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)//更新 {//因为s1的编号要比s2的小 所以当出现一个比当前最小的还要小的时候 //就要重新更新数据 因为s2为第二小 所以把原先最小的数给s2就完成了更新//然后把最新的最小的给s1 就使得s1为当前第一小 s2为当前第二小 m2= m1;//深度更新 x2 = x1;//位置更新 m1 = HT[i].weight;//重新赋值 x1 = i;//更新位置 }else if(HT[i].parent == 0 && HT[i].weight <m2){//要是新出现的数比当前第二小的小但是比第一小要大时 只要更新s2即可 m2 = HT[i].weight;x2 = i;}}s1 = x1;s2 = x2;
//最后把位置传递给s1,s2
}
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];//把之前读入的每一位的权重导入weight }//给结构体赋值for (int i = 1;i<=2*n-1;i++) {HT[i].parent =0;HT[i].lchild =0;HT[i].rchild =0;}for (int i=n+1;i<=2*n-1;i++){SelectTwoMin(i-1,HT,s1,s2);//找权值最小的两个点 HT[i].lchild  =s1;//找到它的孩子 HT[i].rchild  =s2;HT[s1].parent =i;//新找到的孩子节点的父节点为当前节点 HT[s2].parent =i;HT[i].weight =HT[s1].weight +HT[s2].weight ;//新的节点的权重为两个相加 }//下面为哈夫曼树的编码 for (int i=1;i<=n;i++){int start =n-1;//是从孩子节点一直找父节点 所以是逆着往上取 所以从后往前存 char cd[n];//开个数组来保存 cd[n-1]='\0';int c=i;int f=HT[i].parent ;//先找当前节点的父节点 while (f!=0){//只要存在父节点 start--;if(HT[f].lchild ==c){//看当前节点是父节点的左娃还是右娃 cd[start]='0';//左娃为0 }else {cd[start]='1';//右娃为1 }c=f;//找完之后当前节点成为孩子节点 找到当前父节点的父节点 重复上述操作 f=HT[f].parent ;}HC[i]=new char [n-start];strcpy(HC[i],&cd[start]);//找完之后把编码赋值给HC }
}

哈夫曼树及哈夫曼编码(10分)相关推荐

  1. 蓝桥哈夫曼树C语言,实验四 哈夫曼树及哈夫曼编码

    实验目的## 掌握哈夫曼树的概念.哈夫曼编码及其应用. 掌握生成哈夫曼树的算法. 会用哈夫曼树对传输报文进行编码. 掌握二叉树的二叉链表存储方式及相应操作的实现. ##实验内容## 用哈夫曼编码进行通 ...

  2. python哈夫曼树_python霍夫曼树

    class Node(): data=0 left=None right=None father=None def __init__(self,data,left,right): self.data= ...

  3. 一文看懂哈夫曼树与哈夫曼编码

    转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299884.html 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUF ...

  4. 树:哈夫曼树和哈夫曼编码的详细介绍以及代码实现

    闲扯前言 哈夫曼编码的代码实现对于初学数据结构的同学可能会有些困难,没有必要灰心,其实没啥,学习就犹如攀登一座又一座的山峰,每当我们攻克一个难点后,回首来看,也不过如此嘛.我们要做的就是不断的去攀越学 ...

  5. 听说你还不懂哈夫曼树和哈夫曼编码

    基本概念 哈夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,在实际中有广泛的用途. 基本概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径. 路径长度:路径上的分 ...

  6. 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  7. 【Java数据结构与算法】第十二章 哈夫曼树和哈夫曼编码

    第十二章 哈夫曼树和哈夫曼编码 文章目录 第十二章 哈夫曼树和哈夫曼编码 一.哈夫曼树 1.基本术语 2.构建思路 3.代码实现 三.哈夫曼编码 1.引入 2.介绍 3.代码实现哈夫曼编码综合案例 一 ...

  8. 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

    1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...

  9. 【数据结构】-哈夫曼树以及哈夫曼编码

    哈夫曼树的几个定义 哈夫曼树又叫最优二叉树:特点是带权路径最短 带权路径长度:该结点到根结点的路径长度乘以该结点的权值. 树的带权路径长度(WPL):所有叶子结点到根结点的带全路径长度之和. 最优二叉 ...

  10. C++ 实现哈夫曼树和哈夫曼编码

    C++ 实现哈夫曼树和哈夫曼编码 一.哈夫曼树的定义 二.哈夫曼树的构造算法 三.哈夫曼编码 四.哈夫曼算法实现 1.定义一个结点类 2.定义一个哈夫曼编码类 3.定义一个哈夫曼树类 4.设置初始值 ...

最新文章

  1. 刚发现的 Wi-Fi 安全漏洞,可能危及全球所有设备!
  2. 朋友来网易面试,挂了~
  3. fullcalendar 显示的时间间隔只有四十五分钟_Linux命令行监控程序,还能实时高亮显示差异,我就选它了...
  4. 2015-2016 ACM-ICPC Southwestern Europe Regional Contest (SWERC 15)
  5. c++中实现域内,左,右对齐的方法
  6. Web前端开发应该避免的几个思维误区
  7. C语言技巧之长度为0的数组
  8. 一段能用来统计ip访问的代码(自用)包括所在地
  9. oracle dblink 验证,Oracle DBLINK 简单使用
  10. Setting Expires and Cache-Control: max-age headers for static resources in ASP.NET
  11. ajax 刷新output,JSF生命周期及AJAX局部刷新
  12. 机器学习—关联规则分析之Apriori算法及其python实现
  13. 【转】取画刷(HBrush)的6种方法
  14. 运行elasticsearch时报错:could not find java; set JAVA_HOME or ensure java is in PATH
  15. 集成学习01_xgboost参数讲解与实战
  16. php云erp进销存v8安装,PHP仿金蝶云ERP进销存V8网络多仓版源码
  17. 计算机cpu温度显示原理,电脑cpu温度怎么看
  18. MATLAB实战系列(十三)-Matlab绘制柱形图使用技巧解答(附Matlab代码)
  19. office 中墨迹书写工具_在word2019或ppt2019中如何调出墨迹书写工具
  20. 列宽一字符等于多少厘米_【excle列宽等于】excel里面的列宽和行高单位是多少?多少等于1厘米?怎么对比的?...

热门文章

  1. 代码评审的价值和规范
  2. SpatialTE:从空间转录组数据集分析转座因子表达的工具
  3. dedecms如何在首页调用会员信息(会员头像和名字等)
  4. XP系统屏幕倒立翻转了怎么办???
  5. 什么是UI设计?UI学习一般分几个阶段呢?
  6. 企业并购方式及并购操作流程
  7. ParrotSec 中文社区 QQ群认证 Openssl解密
  8. python输出被五整除的数_Python程序打印给定数字的所有被3和5整除的数字
  9. freeswitch mrcp 源码分析--数据接收(下)
  10. 【转】金蝶EAS BOS工作流开发(附带JAVA脚本)