函数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);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;
}
/* 你的代码将被嵌在这里 */
void SelectTwoMin(int upbound, HuffmanTree HT, int &s1, int &s2)
{int min1=10000,min2=10000,num1,num2;for(int i=1;i<=upbound;i++){if(HT[i].parent==0&&HT[i].weight<min1){min2=min1;num2=num1;min1=HT[i].weight;num1=i;}else if (HT[i].parent==0&&HT[i].weight<min2){min2=HT[i].weight;num2=i;}s1=num1;s2=num2;}}
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n)
{//空间开辟HT=(HuffmanTree)malloc(sizeof(HTNode)*(2*n-1));HC=(char**)malloc(sizeof(char*)*(n+1));//注意这里只是开辟了(n+1)个数组指针,各个指针并没有开辟空间for(int i=0;i<(n+1);i++)//给每个字符串开辟空间{HC[i]=(char*)malloc(sizeof(char)*(n+1));memset(HC[i],0,sizeof(char)*(n+1));}//赋初值for(int i=1;i<=2*n-1;i++){HT[i].parent=0;HT[i].lchild=0;HT[i].rchild=0;if(i<=n)HT[i].weight=w[i-1];elseHT[i].weight=0;}//构建哈夫曼树for(int i=n+1;i<=2*n-1;i++){int s1=0,s2=0;SelectTwoMin(i-1,HT,s1,s2);//找出当前最小的两个数下标HT[i].lchild=s1;//更新HT[i].rchild=s2;HT[i].weight=HT[s1].weight+ HT[s2].weight;HT[s1].parent=i;HT[s2].parent=i;}for(int i=1;i<=n;i++){char *a="";//从叶子开始往上找直到根节点a=(char*)malloc(sizeof(char)*(n+1));int k=i;int top=n-1;a[n]='\0';while(HT[k].parent){if(HT[HT[k].parent].lchild==k){a[top--]='0';}else if(HT[HT[k].parent].rchild==k){a[top--]='1';}}strcpy(HC[k],a+top+1);//复制过去}}

6-1 哈夫曼树及哈夫曼编码分数相关推荐

  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. mysql 未知列_mysql – ‘字段列表’连接中的未知列’..’
  2. python安装django模块_python中安装django模块的方法
  3. 2.42死锁的处理策略一预防死锁
  4. Grafana密码重置为admin
  5. K8S_Google工作笔记0010---通过二进制方式_生成SSL证书文件
  6. 在Bash中重定向stderr和stdout
  7. slam魔改的支持数据库动态虚拟墙,禁行线costmap_prohibition_layer
  8. 基于Keras搭建mnist数据集训练识别的Pipeline
  9. Javascript学习
  10. 如何下载Visual C++ 2010 学习版(即 Visual C++ 2010 Express)
  11. 【历史上的今天】3 月 8 日:游戏机之父诞辰;搜索技术之父出生;MIT 公开演示旋风计算机
  12. [美容美发培训学校网站模板]织梦模版+响应式形象设计艺术教育学校网站dedecms模板+手机自适应
  13. 南京计算机徐宪忠,nakaga
  14. 微信小程序打卡签到页面(有效果图)
  15. 知能行vs传统备考,考研数学可以很轻松!
  16. 方法教程:如何下载网易云音乐上的视频到本地电脑
  17. 景联文科技:为扫地机器人AI训练提供数据采集标注解决方案
  18. 电脑出现 initialization failure 问题
  19. 鸿蒙启智 博学多才,如何启智——【3岁阶段孩子的教养之63】
  20. 虚拟服务器怎么用命令重启服务,虚拟机服务器重启命令行

热门文章

  1. 超级授权专业版 SuperSU Pro v2.68 简体中文版
  2. 什么pdf转换成word转换器在线好
  3. python实现雪花飘落的效果_简单说 JavaScript实现雪花飘落效果
  4. Calendars and Reminders
  5. 二舅治好我的精神内耗,也让我火出了B站
  6. 记录:图片转字符画及文字转字符画
  7. 9. 广义表 - 广义表概念,存储结构,深度/长度,复制算法
  8. python中的exifread库只要一张图片就能获取你的精确位置
  9. Vim 插件 -- Pathogen
  10. 【云原生】安全容器 Kata Containers