哈夫曼树:给定N个权值作为N个叶子节点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。而哈夫曼编码则是对上述的节点进行左右区分并编码。

思路:弄一个结构体,包含权值weight,该节点的爹parent(一是确认有没有爹,二是确认有没有被用过),该节点的左右孩子lchild,rchild,及其编码code(在知道是谁的左或右孩之后),顺序存储,每一个节点的上述内容,存在HuffmanCode HT,HT[i]中,由基础知识给了n个节点,则共需要2n-1个节点,从1-n开始,从给的节点里选权值最小的且没爹的两个构造一个新节点放在n+1号位置,新节点的左右儿分别为,所选节点的最小和次小,将最小和次小的编码分别设为0和1,此时一个二叉构造完成,重复次过程可得总共的结点及编码。

#include <stdio.h>
#include <stdlib.h>
#define MaxNode 100
typedef int HuffmanCode;
typedef struct HTNode{int weight;int parent;int lchild,rchild;HuffmanCode code;
}HTNode,*HuffmanTree;
void Select(HuffmanTree *HT,int n,int *s1,int *s2){//选最小且没爹的两个int i;//unsigned不看符号位,故unsigned一般表示的是非负数unsigned int min=9999;int temp1=0,temp2=0;for(i=1;i<=n;i++){if((*HT)[i].parent==0&&(*HT)[i].weight<min){min=(*HT)[i].weight;temp1=i;}}*s1=temp1;min=9999;for(i=1;i<=n;i++){if((*HT)[i].parent==0&&(*HT)[i].weight<min&&i!=temp1){min=(*HT)[i].weight;temp2=i;}}*s2=temp2;
}
void CreateHuffmanTree(HuffmanTree *HT,int n){int i,j,k=0,m,s1,s2;int a[10];//此数组用来存编码if(n<=1)return;m=2*n-1;//n个结点构造成哈夫曼树需2*n-1个结点(*HT)=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//用[1,m]for(i=1;i<=m;i++){//赋初值(*HT)[i].lchild=0;(*HT)[i].rchild=0;(*HT)[i].parent=0;(*HT)[i].code=-1;}for(i=1;i<=n;i++){scanf("%d",&(*HT)[i].weight);}for(i=n+1;i<=m;i++){Select(HT,i-1,&s1,&s2);//挑最小的两个(*HT)[s1].parent=i;(*HT)[s2].parent=i;(*HT)[i].lchild=s1;(*HT)[s1].code=0;(*HT)[i].rchild=s2;(*HT)[s2].code=1;(*HT)[i].weight=(*HT)[s1].weight+(*HT)[s2].weight;}for(i=1;i<=n;i++){j=i;printf("%d的编码:",(*HT)[j].weight);while((*HT)[j].parent!=0){a[k]=(*HT)[j].code;j=(*HT)[j].parent;k++;}//因未用二维数组,故存完直接打印输出,接着用于下一把while(k!=0){printf("%d",a[k-1]);k--;}printf("\n");}
}
void main(){int i,m,n=6;//1 4 6 8 9 14HuffmanTree HT;CreateHuffmanTree(&HT,n);m=2*n-1;printf("结点:");for(i=1;i<=m;i++){printf("%d ",HT[i].weight);}system("pause");
}

C实现利用给定的权值构造哈夫曼树并进行哈夫曼编码相关推荐

  1. 数据结构题:根据所给权值设计相应的哈夫曼树,并设计哈夫曼编码

    文章目录 前言 一.涉及到的知识点 二.例题讲解 1.例题1 2.例题2 总结 前言 在数据结构树的这章中,常常有题目,是这样的"给定一组权值-,试设计相应的哈夫曼树",有的还要求 ...

  2. 树12——构造哈夫曼树并输出哈夫曼编码

    树12--哈夫曼树 哈夫曼树 为一组权值分别为2.4.7.15的结点序列构造一棵哈夫曼树,然后输出相应的哈夫曼编码. 为了便于设计,可利用一个二维数组实现哈夫曼树的算法.因为需要保存字符的权重.双亲结 ...

  3. 给定结点权值,求哈夫曼树的带权路径长度和

    1.哈夫曼树概念 一棵树中,从任意一个结点到达另一个结点的通路叫做路径,该路径包含的边的个数称为路径长度,每个结点带有的表示某种意义的值成为权值.从根结点到叶子结点的路径长度乘以叶子节点权值,得到的值 ...

  4. 利用最小堆编程实现给定权值集合下构造相应霍夫曼树的算法,并解决以下问题: 有一电文共使用五种字符a,b,c,d,e,其出现频率依次为4,7,5,2,9。

    本文参考原博客:https://blog.csdn.net/weixin_39469127/article/details/80573973 本文整理了最小堆结合哈夫曼树实现编解码的相关代码. 直接上 ...

  5. 【数据结构和算法笔记】哈夫曼树的概念,构造和应用(利用哈夫曼编码压缩文本)

    目录 哈夫曼树定义: 构造哈夫曼树: 哈夫曼编码 前缀编码: 应用(压缩文本) 哈夫曼树定义: 构造哈夫曼树: 哈夫曼编码 前缀编码:  哈夫曼编码是前缀编码 哈夫曼树的性质 哈夫曼树的任意非叶结点的 ...

  6. 数据结构之权值(在吊挂中的实际应用)

    (1)这只是在数据结构中的权值理解,不代表其他方面. 哈夫曼树中的权值可以理解为:权值大表明出现概率大.一个结点的权值实际上就是这个结点子树在整个树中所占的比例. (2)在服装行业的吊挂流转中,除了正 ...

  7. 哈夫曼树的构建、编码以及带权路径长计算

    给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较 ...

  8. JAVA实现二叉树带权路径长度和_哈夫曼树的构建与最小带权路径长度

    注意:哈夫曼树并不唯一,但带权路径长度一定是相同的. 二叉树:每个结点最多含有两个子树的树称为二叉树. 定理:对于具有n个叶子结点的哈夫曼树,共有2n-1个结点. 哈夫曼树介绍 1哈夫曼树的定义 哈夫 ...

  9. 数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)

    目录 什么是哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 图解操作 代码实现 代码解析 哈夫曼树的特点 哈夫曼编码 不等长编码 二叉树用于编码 哈夫曼编码实例 什么是哈夫曼树 我们先举个例子: 要将百分制 ...

最新文章

  1. form表单ajax提交 ac,請求Ajax 帶返回值的通用方法, 自動獲取頁面控件值(form表單post方法提交 ),自動給控件賦值...
  2. 让IT工作者过度劳累的12个坏习惯
  3. python sizeof_python 变量作用域 v.__sizeof__() python 深复制 一切皆对象 尽量减少内存消耗 赋值语句的原理...
  4. redis源码剖析(5):基础数据结构inset
  5. 6.Linux/Unix 系统编程手册(上) -- 进程
  6. root用户配置免密登录_ssh免密登录(普通用户和root用户)
  7. Axure 8.0破解版下载
  8. [答疑]关于产品线:充气娃娃,苍井空,猩猩
  9. C#中的Builder模式
  10. Linux 打包压缩命令
  11. 上海2018计算机中级职称,2018中级职称评定申报要求
  12. 基于深度学习的帧内预测技术
  13. 【C#实现猜数字游戏】
  14. 编解码学习笔记(三):Mpeg系列——Mpeg 1和Mpeg 2
  15. 轻量化网络(二)MobileNetV2: Inverted Residuals and Linear Bottlenecks
  16. 关于360提示发现木马—HEUR/QVM.Malware.Gen
  17. Excel应用-各地GDP的综合对比图表-Part2(平均线图、复合饼图、瀑布图、帕累托图)
  18. Python+selenium+360浏览器实现自动测试
  19. 怎样把视频中的音频提取成mp3?
  20. 适合win7的python版本_windows支持哪个版本的python

热门文章

  1. TYPE-C接口电路设计篇(二)
  2. 精准获得目标企业客户的秘诀-8manage CRM
  3. Linux平台网络配置-----C语言
  4. 智能手机和平板的GPS精度测试
  5. 2023秋招华为笔试常考题整理
  6. Valgrind学习总结
  7. vscode远程连接服务器+上下传文件
  8. 在线数学函数图形和在线数据结构演示
  9. #Reading Paper#【曝光偏差】 Cross Pairwise Ranking for Unbiased Item Recommendation
  10. 找感觉的第一个小程序