欢迎关注我的网站:http://www.omegaxyz.com/
一、 实验目的

构造一个哈夫曼树,并根据所构造的哈夫曼树求其哈夫曼树的编码;
二、 基本思路

  1. 将每个英文字母依照出现频率由小排到大,最小在左,组成一个序列
  2. 每个字母都代表一个终端节点(叶节点),比较每个字母的出现频率,将最小的两个字母频率相加合成一个新的节点,将两个字母从序列中删除,将生成的节点加入到字母队列中
  3. 重复前面两步,直到序列中没有字母为止
    进行编码:
  4. 给霍夫曼树的所有左链结’0’与右链结’1′
  5. 从树根至树叶依序记录所有字母的编码

三、基本代码

1.Huffman.h文件

typedef struct{int weight;int parent,lchild,rchild;
}HTNode,*HuffmanTree;typedef char **HuffmanCode;void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n);
void HuffmanSelect(HuffmanTree HT,int k,int &s1,int &s2);

2.主要函数
①select函数

void HuffmanSelect(HuffmanTree HT,int n,int &s1,int &s2)
{  int minn=10000000,maxx=10000000;  s1=s2=0;  for(int i=1; i<=n; i++)  {  if(HT[i].parent==0)  {  if(HT[i].weight<minn)  {  minn=HT[i].weight;s1=i;                  }  }  }  int t=HT[s1].weight;  HT[s1].weight=maxx;  minn=99999998;  for(int i=1; i<=n; i++)  {  if(HT[i].parent==0)  {  if(HT[i].weight<minn)  {  minn=HT[i].weight;  s2=i;  }  }  }  HT[s1].weight=t;
}  

②编码函数

void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)
{if(n<=1)return;int m=2*n-1;HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));int i;for(i=1;i<=n;i++){HT[i].weight=w[i];HT[i].parent=HT[i].rchild=HT[i].lchild=0;}for(;i<=m;i++){HT[i].weight=HT[i].parent=HT[i].rchild=HT[i].lchild=0;}int s1=0,s2=0;for(i=n+1;i<=m;i++){HuffmanSelect(HT,i-1,s1,s2);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=(HuffmanCode)malloc((n+1)*sizeof(char*));char *cd;cd=(char *)malloc(n*sizeof(char));cd[n-1]='\0';int start;for(i=1;i<=n;++i){start=n-1;int c=0;int f=0;for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent){if(HT[f].lchild==c) cd[--start]='0';else cd[--start]='1';}HC[i]=(char*)malloc((n-start)*sizeof(char));strcpy(HC[i],&cd[start]);}free(cd);
}

数据结构Huffman树及编码相关推荐

  1. 数据结构源码笔记(C语言):Huffman树字符编码

    #include <stdio.h> #include<string.h> #define N 10 /*待编码字符的个数,即树中叶结点的最大个数*/ #define M 2* ...

  2. 数据结构-Huffman树

    Huffman树的编码和解码 思想:1.统计字符串每个字母出现的个数2.依次取出两个最小的字母进行合并(分别作为左右子节点,另左子节点<右子节点的值),使用他们值之和作为根节点的值,并将根节点加 ...

  3. Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。

    Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 1. 找到{p ...

  4. 基础练习 Huffuman树 _C语言和C++描述!(Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。   给出一列数{pi}={p0, p1, …, pn-1)

    问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 1. ...

  5. Huffman树进行编码和译码

    //编码 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> ...

  6. 数据结构 Huffman树(霍夫曼树、哈夫曼树)

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

  7. Huffman树及其编码实现

    一个拥有n个待编码的字符串,其哈夫曼树具有 2n-1个节点. 用构造哈夫曼树的过程生成的二进制前缀编码.哈夫曼树是一类带权路径长度最短的树. 特点:长度最短 哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码 ...

  8. Java学习——数据结构——Huffman树

    学习尚硅谷韩顺平老师的Java数据结构笔记,详情请移步网站 1.介绍 (1) 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树, ...

  9. 哈夫曼树--链式结构(建立huffman树、编码、解码)

    引子: 用链式结构来建立哈夫曼树. 总体思路是: 将每一棵树(这是每一棵树只有一个节点,头节点)放在一个优先队列中(下面的是链表实现的优先队列),频率(rate)小的在队列头,取出队列头两个,频率相加 ...

  10. python构建huffman树_python:哈夫曼树,PythonHuffuman

    Python:Huffuman树 题目 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列 ...

最新文章

  1. python笔记基础-Python学习笔记(基础)
  2. 如何启用SAP Business by design里的Correction Invoice功能
  3. C++ 面向对象(二)—— 操作符重载
  4. [js]写一个获取非行间样式的方法
  5. Java网络编程从入门到精通(15):为什么要使用SocketAddress来管理网络地址
  6. (Note)欧空局多光谱卫星Sentinel-2
  7. 小米摄像头卡刷固件包官方下载_三星GalaxyA90澳洲版刷机包(官方线刷固件原厂系统包下载A908BXXU1ASJ4-OPS)...
  8. c lua mysql 扩展_lua安装及luarocks安装mysql扩展
  9. Android中的Apk的加固(加壳)原理解析和实现
  10. 百度竞价常见问题:影响点击量的因素有哪些?
  11. 四川省巴中市谷歌高清卫星地图下载
  12. dbm与功率之间简单换算
  13. 复旦-华盛顿大学EMBA 二十年20人丨徐欣:从外企转战民企的变身
  14. Excel函数大全(Excel Function List)-Part 1
  15. 计算机教研实训报告,2020计算机实训心得体会范文
  16. vue项目中解决路由重复点击报错问题
  17. linux环境下安装pyhdf
  18. python爬虫高级知识兼实例汇总-中华英才网
  19. mysql 的delete from 子查询限制
  20. Java、JSP物业管理信息系统毕业设计

热门文章

  1. 43. 算法调用优先于手写的循环
  2. Springboot集成JavaMailSender发送邮件
  3. android 自定义园动画,如何在Android中绘制一个带有动画的圆
  4. android 自定义加载动画效果,Android自定义加载动画-旋转的叶子
  5. springsecurity 登录失败_145-Spring Security
  6. (day 21 - 辅助栈加模拟)剑指 Offer 31. 栈的压入、弹出序列
  7. matplotlib plot 分组_Python数据分析模块二:Matplotlib
  8. opencv获取人脸眼镜位置_用opencv检测人眼并定位瞳孔位置
  9. CSS:设置图片不可拖动
  10. Java8+函数式开发库Vavr使用入门