哈夫曼树要解决的问题是对不同频率元素查找的效率最高,哈夫曼编码代码如下:

首先要明白,哈夫曼树要查找的元素都在叶结点上,而且哈夫曼树的最终元素是确定的为2*n-1个。这样我们可以用结点数组来表示树,每一个结点的 child和parent指向自己的父亲和儿子的索引。首先实现select函数,从结点数组选出权重最小的两个合并,存储新结点,构造出哈夫曼树,然后从叶结点开始向上查找,左儿子为0,右儿子为1得到哈夫曼编码,最后再把编码反转即可。

//huffmanCoding.c
#include <stdio.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
#define N 6typedef struct huffNode
{int weight;   //权重int lchild, rchild, parent;  //左右子节点和父节点
}HTNode, *HuffTree;
typedef char **HuffCode;//找出数组中无父节点且权值最小的两个节点下标,分别用s1和s2保存
void select(const HuffTree &HT, int n, int &s1, int &s2);
//HT:哈夫曼树,HC:哈夫曼编码,w:构造哈夫曼树节点的权值,n:构造哈夫曼树节点的个数
void HuffmanCode(HuffTree &HT, HuffCode &HC, int *w, int n);int main()
{int i;char key[N] = { '0','A','B','C','D','E' };//第0个元素保留不用int w[N] = { 0,1,2,4,5,6 }; //第0个元素保留不用HuffTree HT;HuffCode HC;HuffmanCode(HT, HC, w, N - 1);for (i = 1; i < N; i++)printf("%c:%s\n", key[i], HC[i]);printf("\n");return 0;
}//找出数组中权值最小的两个节点下标,分别用s1和s2保存
void select(const HuffTree &HT, int n, int &s1, int &s2)
{int i;s1 = s2 = 0;int min1 = INT_MAX;//最小值,INT_MAX在<limits.h>中定义的int min2 = INT_MAX;//次小值for (i = 1; i <= n; ++i){if (HT[i].parent == 0){//筛选没有父节点的最小和次小权值下标if (HT[i].weight < min1){//如果比最小值小min2 = min1;s2 = s1;min1 = HT[i].weight;s1 = i;}else if ((HT[i].weight >= min1) && (HT[i].weight < min2)){//如果大于等于最小值,且小于次小值min2 = HT[i].weight;s2 = i;}else{//如果大于次小值,则什么都不做;}}}
}//HT:哈夫曼树,HC:哈夫曼编码,w:构造哈夫曼树节点的权值,n:构造哈夫曼树节点的个数
void HuffmanCode(HuffTree &HT, HuffCode &HC, int *w, int n)
{int s1;int s2;int m = 2 * n - 1;       //容易知道n个节点构造的哈夫曼树是2n-1个节点int i, c, f, j;char *code;  //暂存编码的HT = (HuffTree)malloc((m + 1) * sizeof(HTNode));  //0单元未使用for (i = 1; i <= n; i++)HT[i] = { w[i],0,0,0 };//初始化前n个节点(构造哈夫曼树的原始节点)for (i = n + 1; i <= m; i++)HT[i] = { 0,0,0,0 };  //初始化后n-1个节点//构建哈夫曼树for (i = n + 1; i <= m; i++){select(HT, i - 1, s1, s2);//找出前i-1个节点中权值最小的节点下标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;}//哈夫曼编码HC = (char **)malloc((n) * sizeof(char *));//暂存编码code = (char *)malloc(n * sizeof(char));//使用了第0单元for (i = 1; i <= n; i++){for (c = i, f = HT[c].parent, j = 0; f != 0; c = HT[c].parent, f = HT[c].parent, j++){//从叶子扫描到根if (HT[f].lchild == c){code[j] = '0';}else if (HT[f].rchild == c){code[j] = '1';}else{//否则什么也不做;}}code[j] = '\0';for (int k = 0; k < j/2; k++){char tmp = code[k];code[k] = code[j - 1- k];code[j - 1- k] = tmp;}HC[i] = (char *)malloc(strlen(code) * sizeof(char));strcpy(HC[i], code);}
}

哈夫曼树和哈夫曼编码相关推荐

  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. java 内存映射文件进程间通讯_[转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile...
  3. Vue 进入/离开动画
  4. AI英特尔杯公开课:2019.06.27在线直播《研究生人工智能创新大赛—AI赋能,创新引领》课堂笔记和感悟(一)
  5. CF79D Password(P3943 星空)
  6. 【渝粤教育】 国家开放大学2020年春季 2710蔬菜栽培技术 参考试题
  7. 2022年中国美妆护肤品行业投资研究报告
  8. 华为还是输了!双11战报出炉,离苹果仍有距离
  9. 如何将公式插入到word
  10. JavaSE----属性、方法
  11. axios请求跨域前端解决_Vue-创建axios实例并实现跨域请求(完整过程-前端)
  12. mysql5.7 密码不过期,mysql5.7 密码过期问题
  13. app营销实训报告_数据科学实训总结(15):一睹python数据分析的真容
  14. OpenFOAM提取等值面并计算面积
  15. 【Linux】VirtualBox设置静态ip
  16. 带小数的二进制转十进制(C代码)
  17. C++ 侯捷系列视频汇总
  18. html六边形空心,六边形空心预制块模具基本知识
  19. 51单片机密码锁(含确认键、清零键、删除键)
  20. arcgis 将地图点转换为屏幕坐标_ArcGIS地图投影和坐标转换方法

热门文章

  1. 联想微型计算机拆装图解,联想昭阳e43g拆机教程【详细介绍】
  2. c语言rst关系,为什么服务器突然回复RST——小心网络中的安全设备
  3. C#微信公众号开发实践--通过控制台程序发布图文消息(2020/8/4实测可用)
  4. 学习C C++的必备技能(1)
  5. Cocos Creator 微信登录授权按钮适配
  6. 应届毕业生 求职面试宝典
  7. 相对比性能稳定速度快的香港服务器有哪些
  8. 浪漫七夕—很幸运一路有你
  9. MindManager教你做一份完美的笔记
  10. win10装win7进入不了bios的解决方法