哈夫曼树

#include "iostream"
#include "string.h"
using namespace std;//定义哈夫曼树存储结构
typedef struct{int weight;//权重int parent,lc,rc;//指向双亲、左孩子、右孩子指针
}HTNode,*HuffmanTree;
//定义哈夫曼编码存储结构
typedef char** HuffmanCode;
//选择两个最小权重的结点
void SelectMin(HuffmanTree ht,int n,int &s1,int &s2){int i;//查找第一个无双亲的结点for(i=1;i<=n;i++)if(ht[i].parent==0){s1=i;break;}//查找权重第一小的结点for(;i<=n;i++){if(ht[i].parent==0 && ht[i].weight<ht[s1].weight)s1=i;}for(i=1;i<=n;i++)if(ht[i].parent==0 && i!=s1){s2=i;break;}//查找权重第二小的结点for(i=1;i<=n;i++)if(ht[i].parent==0 && i!=s1)if(ht[i].weight<ht[s2].weight)s2=i;
}//建立哈夫曼树
void CreateHuffmanTree(HuffmanTree &ht,int *w,int n){int i,m,s1,s2;if(n<=1)return;m=2*n-1;//m是总的哈夫曼树结点数//动态申请m+1个HTNode存储单元,0号单元不用ht=new HTNode[m+1];//初始化n个叶子结点for(i=1;i<=n;i++){ht[i].weight=w[i-1];ht[i].parent=ht[i].lc=ht[i].rc=0;}//初始化n-1个非叶结点for(;i<=m;i++){ht[i].parent=ht[i].lc=ht[i].rc=0;}for(i=n+1;i<=m;i++){//选择两个权值最小的结点,分别用s1,s2标识SelectMin(ht,i-1,s1,s2);//生成树根结点的权重等于其左右孩子权重之和ht[i].weight=ht[s1].weight+ht[s2].weight;//左右孩子的双亲等于新生成的结点ht[s1].parent=ht[s2].parent=i;ht[i].lc=s1;//生成结点的左孩子等于s1ht[i].rc=s2;//生成结点的左孩子等于s2}
}
//对立哈夫曼编码
void CreateHuffmanCode(HuffmanCode &hc,HuffmanTree ht,int n){int i,c,f,start;hc=new char*[n+1];char *cd=new char[n];cd[n-1]='\0';for(i=1;i<=n;i++){start=n-1;c=i;f=ht[c].parent;while(f!=0){if(c==ht[f].lc)cd[--start]='0';elsecd[--start]='1';c=f;f=ht[c].parent;}hc[i]=new char[n-start];strcpy(hc[i],&cd[start]);}
}
//打印哈夫曼编码
void PrintHuffmanCode(HuffmanCode hc,HuffmanTree ht,int n){int i;for(i=1;i<=n;i++){cout<<ht[i].weight<<":"<<hc[i]<<endl;}
}
void main(){HuffmanTree ht;HuffmanCode hc;int n=8,w[]={2,4,6,3,7,45,32,56};CreateHuffmanTree(ht,w,n);CreateHuffmanCode(hc,ht,n);PrintHuffmanCode(hc,ht,n);}

Huffman-哈夫曼树-数据结构相关推荐

  1. 【赫夫曼树数据结构及其应用】

    本文主要介绍Java中赫夫曼树数据结构的基本原理.实现方式以及使用场景.赫夫曼树(Huffman Tree)是一种带权路径最短的二叉树,广泛应用于数据压缩和编码等领域. 一.赫夫曼树的基本概念 赫夫曼 ...

  2. c语言霍夫曼函数,使用C语言详解霍夫曼树数据结构

    1.基本概念 a.路径和路径长度 若在一棵树中存在着一个结点序列 k1,k2,--,kj, 使得 ki是ki+1 的双亲(1<=i 从 k1 到 kj 所经过的分支数称为这两点之间的路径长度,它 ...

  3. Huffman哈夫曼树编码字符,binarytree,Python

    Huffman哈夫曼树(霍夫曼树,赫夫曼树)在通信领域最主要的应用是数据编码.假设现在有A.B.C.D.E五个字符,它们出现的概率或者权值不同,从A到E,权值依次降低,那么就可以用哈夫曼最优二叉树对其 ...

  4. 每日四题打卡-4.15:耍杂技的牛/贪心绝对值不等式-货仓选址/贪心排序不等式-排队打水/huffman哈夫曼树-合并果子

    耍杂技的牛 具体:https://blog.csdn.net/qq_27262727/article/details/105515507 农民约翰的N头奶牛(编号为1..N)计划逃跑并加入马戏团,为此 ...

  5. 哈夫曼树--数据结构

    文章目录 哈夫曼树 哈夫曼树的特点 构造哈夫曼树算法 哈夫曼编码 示例 哈夫曼树构造代码 示例 哈夫曼编码和二进制编码的比较    哈夫曼树   哈夫曼树,又称最优树,时一类带权路径长度最短的树.   ...

  6. Huffman霍夫曼树,霍夫曼编码

    霍夫曼树基本概念: 路径:从一个结点往下到孩子或孙子结点之间的同理 路径长度:如结点1到结点7的路径长度=2 结点的权:将结点的某一属性值作为结点的权 带权路径长度:从根节点到该结点*该结点的权:如结 ...

  7. Java实现Huffman哈夫曼树(数组实现)

    代码如下: package HuffmanTreeArrays;import java.util.ArrayList; import java.util.Scanner;public class Hu ...

  8. Java实现Huffman哈夫曼树

    代码如下: package HuffmanTree;import java.util.ArrayList; import java.util.LinkedList; import java.util. ...

  9. 数据结构源码笔记(C语言):哈夫曼树

    #include <stdio.h> #include <stdlib.h> #define MAXINT 2147483647 #define MAXNUM 50 #defi ...

最新文章

  1. __getitem__()
  2. React-状态提升
  3. 用VC++实现USB接口读写数据的程序
  4. jQuery学习笔记2
  5. excel vba 快速显示及隐藏所选数据行,并获取多重选择区地址的行列号
  6. sql max同一行_超经典SQL题 | 做完这4道面试题你就过关了
  7. 看不懂JDK8的流操作?5分钟带你入门(转)
  8. linux和windows下,C/C++开发的延时函数,sleep函数
  9. win10打开计算机出现马赛克,主编处理win10系统播放视频影片出现锯齿、马赛克、模糊的办法?...
  10. 10大亮点解读--极通EWEBS4.0
  11. 群晖修改php文件系统,群晖6.2版本修改eSATA挂载NTFS硬盘设置方法
  12. CAD二次开发(VB)代码整理
  13. [BZOJ]4453: cys就是要拿英魂!
  14. c++动态数组的优点,创建和删除
  15. 超大玉螺旋丸 -A的个数 蓝桥杯练习题
  16. python第三方库文件传输_慢步学习,python库文件概述,再来点第三方库文件安装的干货...
  17. html贝塞尔曲线在线,贝塞尔曲线的一些事情_html/css_WEB-ITnose
  18. 兼莱宝分享:不想一直打工,可以做这5个冷门生意,竞争比较小,利润却很不错
  19. laya游戏开发之贪吃蛇大作战(二)—— 贪吃蛇客户端
  20. ubuntu18.04重新安装nvidia驱动

热门文章

  1. CAD怎么标注尺寸?CAD半径标注技巧
  2. springboot解决页面显示ppt text docx 等问题(转换pdf格式)
  3. 图像分割评估指标——surface-distance计算库
  4. 0x4DC0 是一个十六进制数,它对应的 Unicode 编码是中国古老的《易经》六十四卦的第一卦,请输出第 51 卦(震卦)对应的 Unicode 编码的二进制、十进制、八进制和十六进制格式。
  5. 24Java键盘输入涉及方法与具体细节
  6. 循环神经网络(RNN)的原理及实现
  7. 流放者柯南服务器设置文件,流放者柯南服务器设置怎么保存
  8. 心情随笔,浅谈软件开发工作两年感悟与想法(中)
  9. 10.9补卡 CF-189A
  10. java小写金额转大写金额