资源简介
C++实现哈夫曼树及哈夫曼编码,代码简介https://blog.csdn.net/qq_41664447/article/details/90736442,C++源程序可直接运行

代码片段和文件信息
#include
#include
using namespace std;
//哈夫曼树的存储表示
typedef char ElemType;
typedef struct
{
ElemType data; //结点存的数据
int weight; //结点的权值
int parentlchildrchild; //结点的双亲、左孩子、右孩子的下标
} HTNode*HuffmanTree; //动态分配数组存储哈夫曼树
void Select(HuffmanTree HTint nint &s1int &s2);
//构造哈夫曼树
/*算法步骤:
1.初始化:首先动态申请2n个单元,然后循环2n-1次,从1号单元开始,依次将1至2n-1所有单元中的双亲、左孩子、右孩子
的下标都初始化为0;最后再循环n次,输入前n个单元中叶子节点的权值
2.创建树:循环n-1次,通过n-1次的选择、删除与合并来创建哈夫曼树。
选择是从当前森林中选择双亲为0且权值最小的两个树根结点s1和s2;
删除是指将结点s1和s2的双亲改为非0;合并就是将s1和s2的权值和作为一个新结点的权值依次存入到数组的第n+1之后的单元中,
同时记录这个新结点左孩子的下标为s1,右孩子的下标为s2*/
void CreateHuffmanTree(HuffmanTree &HTint n)
{
//构造哈夫曼树HT
if(n<=1)
{
cout<<“HuffmanTree节点数输入错误!“< return;
}
int m=2*n-1;
int s1=1s2=1;
HT=new HTNode[m+1]; //0号单元未用,所以需要动态分配m+1个单元,HT[m]表示根结点
for(int i=1; i<=m; ++i) //将1~m号单元中的双亲、左孩子、右孩子的下标都初始化为0
{
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for(int i=1; i<=n; ++i) //输入前n个单元中叶子结点的权值(包括空格)
{
cout<<“请输入第“< char c;//用来保存之前键入的回车键
c=cin.get();
HT[i].data=cin.get();
cout<<“请输入第“< cin>>HT[i].weight;
}
//--------------------------初始化工作结束,下面开始创建完整哈夫曼树
for(int i=n+1; i<=m; ++i)
{
//通过n-1次的选择、删除、合并来创建哈夫曼树
Select(HTi-1s1s2); //在HT[k](1<=k<=i-1)中选择两个其双亲域为0且权值最小的结点,并返回它们在HT中的序号s1和s2
HT[s1].parent=i;
HT[s2].parent=i; //得到新结点i,从森林中删除s1,s2,将s1和s2的双亲域由0改为i
HT[i].lchild=s1;
HT[i].rchild=s2; //s1,s2分别作为i的左右孩子
HT[i].weight=HT[s1].weight+HT[s2].weight; //i的权值为左右孩子权值之和
}
}
//在HT中选择两个其双亲域为0且权值最小的结点,返回它们在HT中的序号s1和s2
void Select(HuffmanTree HTint nint &s1int &s2)
{
int i=1;//开始初始化wetmin1wetmin2,使用一个i往后找,HT[i].parent==0的结点
int temp;
int wetmin1wetmin2;
//开始寻找前两个HT[i].parent==0的结点,给wetmin1wetmin2初始化
while(HT[i].parent!=0)
i++;
wetmin1=HT[i].weight;
s1=i;
i++;
while(HT[i].parent!=0)
i++;
wetmin2=HT[i].weight;
s2=i;
i++;//从初始值后面的结点开始遍历
//初始化wetmin1wetmin2,将小的赋值给wetmin1
if(wetmin1>wetmin2)
{
temp=wetmin2;
wetmin2=wetmin1;
wetmin1=temp;
temp=s2;
s2=s1;
s1=temp;
}
for(i; i<=n; i++)
{
if(HT[i].parent==0&&HT[i].weight {
wetmin2=wetmin1;
wetmin1=HT[i].weight;
s2=s1;
s1=i;
}
else if(HT[i].parent==0&&HT[i].weight {
wetmin2=HT[i].weight;
s2=i;
}
}
}
//哈夫曼编码表的的存储表示
typedef char **HuffmanCode;//动态分配数组存储哈夫曼编码表
//根据哈夫曼树求哈夫曼编码
void CreateHuffmanCode(HuffmanTree HTHuffmanCode &HCint &n)
{
//从叶子到根逆向求每个字符的哈夫曼编码,存储
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
.CA.... 9940 2019-06-01 01:35 C++实现哈夫曼树及哈夫曼编码\HuffmanTree.cpp
.CA.... 1053276 2019-06-01 01:18 C++实现哈夫曼树及哈夫曼编码\HuffmanTree.exe
.CA.... 9025 2019-06-01 01:18 C++实现哈夫曼树及哈夫曼编码\HuffmanTree.o
.C.D... 0 2019-06-02 09:51 C++实现哈夫曼树及哈夫曼编码
----------- --------- ---------- ----- ----
1072241 4
- 上一篇:C++ primer plus第五版学习笔记
- 下一篇:C语言实现迷宫问题
相关资源
- 利用C++哈希表的方法实现电话号码查
- 学校超市选址问题(数据结构C语言版
- 数据结构,迷宫问题C语言版源代码
- DSDEMO-C演示(数据结构C语言版 严蔚敏
- Wi-Fi IoT智能家居套件-Hi3861(原理图
- 国产车规级芯片KF32A152数据手册V2.5
- 基础qt数据库读取和显示
- Qt查询SQLite数据库
- 使用QWT库实现接收串口数据,并根据
- STM32 LIN通信数据发送实现 测试通过
- MPU6050读取原始加速度、角速度及温度
- 数据结构 图的遍历源代码
- 数据结构实验源代码集
- 实验报告:数据结构长整数四则运算
- 宠物管理系统课程设计(源码+数据库
- 数据结构教程李春葆第五版书中例题
- 计算机数据采集卡编程
- c++ 定时关机程序源码
- VC操作SQLSERVER数据库
- c 操作sqlite数据库.cpp
- 吕鑫vc6c++数据结构视频源码
- 数据结构教程李春葆第五版课后答案
- 李春葆课后习题答案(数据结构教材
- 简单职工管理系统(控制台源码+txt数
- 数据结构1800题 题+答案(全)
- 数据结构(C语言版)ppt课件,清华,
- c++常用游戏算法及数据结构设计
- 数据结构超全面复习导图
- 串口数据采集及显示
- qt上位机采集51单片机温湿度数据
评论
共有 条评论