数据结构---哈夫曼树

数据结构—哈夫曼树

原理:参考趣学数据结构

代码:

#include<stdio.h>
#include<stdlib.h>
#define N 100
#define INF 2^31-1
typedef struct fNode {//哈夫曼树中每个节点的信息int c;//字符int parent;//父节点,左右孩子,权重int lchild, rchild;int weight;
}fNode;
typedef struct rNode {//存储单个的编码字符的编码序列int r[N];int start;//有效编码起始的位置int length;
}rNode;
void huffMan(fNode fnode[],int n) {//构造哈夫曼树  选取二个最小的没有父节点的结点合并,以此类推for (int i = 0; i < n - 1; i++) {//n个字符n-1次的构造即可构造哈夫曼树int min1=INF, min2 = INF;int u =-1,v = -1;for (int j = 0; j < n + i; j++) {//找二个最小的没有父节点的if (fnode[j].weight < min1 && fnode[j].parent==-1) {min2 = min1;//最值同时往前推v = u;min1 = fnode[j].weight;u = j;}else if(fnode[j].weight<min2 && fnode[j].parent == -1) {min2 = fnode[j].weight;v = j;}}fnode[n + i].weight = min1 + min2;fnode[n + i].lchild = u;fnode[n + i].rchild = v;fnode[u].parent = fnode[v].parent = n + i;//更新父节点}
}
void findHuffManCodePath(fNode fnode[],rNode rnode[],int n) {//寻找每个字符编码表示rNode temp;int start=n-1;//最坏的哈夫曼树为一条链表for (int i = 0; i < n; i++) {start = n - 1;//每个字符的编码从叶子节点向根节点遍历int p = fnode[i].parent;int tempv = i;while (p != -1) {//p不等于-1表示有父节点if (tempv == fnode[p].lchild) {temp.r[start] = 0;}else {temp.r[start] = 1;}start--;tempv = p;p = fnode[p].parent;}for (int j = start + 1; j <= n - 1; j++) {//更新每个字符的编码数组rnode[i].r[j] = temp.r[j];rnode[i].start = start + 1;}rnode[i].length = n - start - 1;}int sum = 0;//遍历每个字符的编码数组for (int j = 0; j < n; j++) {//n个字符的编码遍历printf("%d的哈夫曼编码为:", fnode[j].c);for (int k = rnode[j].start; k <= n - 1; k++) {printf("%d", rnode[j].r[k]);}sum += (fnode[j].weight*rnode[j].length);printf("  ");}printf("\n");printf("哈夫曼编码长度为:%d\n",sum);printf("\n");
}
int main() {fNode fnode[N];rNode rnode[N];int u;printf("请输入编码字符的个数:");scanf_s("%d", &u);int length = u;int c;int weight=0;//http://c.biancheng.net/view/1796.html 输入字符参考for (int k = 0; k < u;k++) {//初始化字符编码的信息 //c = getchar();//输入字符scanf_s("%d %d", &c,&weight);fnode[k].c = c;fnode[k].weight = weight;}u = 2 * length - 1;//哈夫曼总共有2n-1个结点for(int i=0;i<u;i++){//初始化结点的左右孩子和父节点信息fnode[i].lchild = -1;fnode[i].rchild = -1;fnode[i].parent = -1;}huffMan(fnode, length);findHuffManCodePath(fnode, rnode, length);system("pause");return 0;
}

测试截图:

请添加图片描述

时间复杂度O(n x n),空间复杂度O(n)

如果存在什么问题,欢迎批评指正!谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[蓝桥杯]错误票据---stringstream应用举例

题目描述 某涉密单位下发了某种票据&#xff0c;并要在年终全部收回。 每张票据有唯一的ID号。全年所有票据的ID号是连续的&#xff0c;但ID的开始数码是随机选定的。 因为工作人员疏忽&#xff0c;在录入ID号的时候发生了一处错误&#xff0c;造成了某个ID断号&#xff0c;另…

热电偶校验仪_热电偶校验方法_烟台一等热电偶,干湿两用温度校验炉公司

杭州中创为您详细解读hzzc6烟台一等热电偶的相关知识与详情&#xff0c;防爆涡轮流量计的转速通过拆正在机壳外的传感线圈来检测&#xff0e;当涡轮流量计叶片切割由壳体内**磁钢发生的磁力线时&#xff0c;就会引起传感线圈中的磁通变革&#xff0e;传感线圈将检测到的磁通周期…

手把手教你用C#做疫情传播仿真

手把手教你用C#做疫情传播仿真在上篇文章中&#xff0c;我介绍了用 C#做的疫情传播仿真程序的使用和配置&#xff0c;演示了其运行效果&#xff0c;但没有着重讲其中的代码。今天我将抽丝剥茧&#xff0c;手把手分析程序的架构&#xff0c;以及妙趣横生的细节。首先来回顾一下运…

word List 10

word List 10 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

[蓝桥杯]回形取数-方向向量+模拟

题目描述 回形取数就是沿矩阵的边取数&#xff0c;若当前方向上无数可取或已经取过&#xff0c;则左转90度。一开始位于矩阵左上角&#xff0c;方向向下。 输入 输入第一行是两个不超过200的正整数m, n&#xff0c;表示矩阵的行和列。接下来m行每行n个整数&#xff0c;表示这个…

java程序员选择多个offer时需要看重哪些?_对不起,我们公司不要本科以下的大学生,学历对于程序员重不重要...

来自普通大学的学生&#xff0c;总会觉得逆袭如梦似幻&#xff0c;机会在哪里&#xff1f;但放长远来看&#xff0c;更重要的是要看到&#xff1a;环境只能影响&#xff0c;却不能决定我们的人生。人生路漫长&#xff0c;最终会怎样&#xff0c;还不一定呢&#xff01;在某综艺…

中小企业团队敏捷产品开发流程最佳实践

近期因为疫情的影响&#xff0c;不少互联网公司开始尝试远程工作。也出不了少如何做好远程工作的方法&#xff0c;我认为不管是场地办公还是远程办公都依赖于原来的产品开发流程。我曾经遵循CMMI5的流程管理过15人左右的跨国/语言/文化团队&#xff0c;也遵循敏捷Scrum管理过9人…

数据结构---二叉线索树

数据结构—二叉线索树 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> typedef struct bmTree {int data;struct bmTree* lchild, *rchild;int ltag, rtag; }bmTree; bmTree * preNULL;//中序遍历的前驱指针 void cr…

[蓝桥杯2019初赛]不同子串-substr,模拟

题目描述 一个字符串的非空子串是指字符串中长度至少为1 的连续的一段字符组成的串。 例如&#xff0c;字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab&#xff0c;一共7 个。 注意在计算时&#xff0c;只算本质不同的串的个数。 请问&#xff0c;字符串0100110001010001 …

revit如何根据坐标进行画线_铭成教你如何根据同步带的齿形进行选型

1、同步带齿形分类梯型齿同步带分为&#xff1a;最轻型MXL、超轻型XXL、特轻型XL、轻型L、重型H、特重型XH、超重型XXH&#xff0c;共七种&#xff0c;这几种是目前市场用的最广泛的。特殊齿型的同步带又分为&#xff1a;最轻型T2.5、轻型T5、重型T10、最重型T20&#xff0c;现…

在VS Code里逛知乎、发文章?知乎 on VS Code来啦!重新定义内容创作!

本文为 牛岱 的原创文章在2020年2月10日首发于“玩转VS Code”知乎专栏你是否已经厌倦了知乎 Web 端文本编辑器糟糕的使用体验和时而出现的奇怪 Bug&#xff1f;身为程序员的你是否想用你最熟悉的 Markdown 语法写答案&#xff0c;并且获得最佳的代码块语法高亮&#xff1f;攥写…

[蓝桥杯]带分数-dfs

题目描述 100 可以表示为带分数的形式&#xff1a;100 3 69258 / 714。 还可以表示为&#xff1a;100 82 3546 / 197。 注意特征&#xff1a;带分数中&#xff0c;数字1~9分别出现且只出现一次&#xff08;不包含0&#xff09;。 类似这样的带分数&#xff0c;100 有 11 种…

线性代数---向量问题的求解方法

线性代数—向量问题的求解方法 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

java 定时_Java线上定时任务不定期挂掉问题分析

作者&#xff1a;IKNOW本尊问题背景收到频繁的告警邮件&#xff0c;定时任务调度失败&#xff0c;查看xxl-job的执行器列表是空的&#xff0c;但是服务又显示健康&#xff0c;查看历史任务执行记录发现执行器是依次递减&#xff0c;由于是线上服务&#xff0c;只能先重启&#…

gRPC in ASP.NET Core 3.x -- Protocol Buffer, Go语言的例子(上)

前两篇文章半年前写的&#xff1a;gRPC in ASP.NET Core 3.0 -- Protocol Buffer&#xff08;1&#xff09;&#xff0c;gRPC in ASP.NET Core 3.0 -- Protocol Buffer&#xff08;2&#xff09;之前把protocol buffer的基础知识讲了一遍&#xff0c;今天使用Go语言做一些例子。…

word List 11

word List 11 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

[蓝桥杯]蚂蚁感冒

题目描述 长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左&#xff0c;有的朝右。 每只蚂蚁都只能沿着杆子向前爬&#xff0c;速度是1厘米/秒。 当两只蚂蚁碰面时&#xff0c;它们会同时掉头往相反的方向爬行。 这些蚂蚁中&#xff0c;有1只蚂蚁感冒了。并且在和其它蚂蚁…

温故知新 .Net重定向深度分析

在早期的.NET Framework程序员心里&#xff0c;重定向Redirect其实分为两种&#xff1a;Response.Redirect&#xff1a;Response对象的Redirect方法提供了一种实现客户端重定向的方法Server.Transfer&#xff1a;Server对象的Transfer方法使用服务器执行重定向&#xff0c;并避…

笔记本电脑销量排名_网友总结京东笔记本销量,联想高居第一,华为表现很出色...

笔记本电脑&#xff0c;还是要看大品牌。网友总结近30天京东笔记本销量&#xff0c;结局让人出乎意料。网友直呼&#xff0c;原来华为笔记本这么强。智能手机的出现&#xff0c;对传统的PC行业造成了一定的影响&#xff0c;但它始终还是无法替代PC的功能。在这个行业中&#xf…

数据结构---二叉排序树

数据结构—二叉排序树 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> typedef struct bstTree {int data;struct bstTree* lchild, *rchild; }bstTree; void createBSTTree(bstTree* & T,int data) {//创建二叉…