文章目录
实验目的
1. 掌握树的存储结构
2. 掌握二叉树的三种遍历方法
3. 掌握 Huffman 树、Huffman 编码等知识和应用
4. 使用 C++、文件操作和 Huffman 算法实现“图片压缩程序”专题编程。
主要仪器设备及耗材
1.安装了Windows 10操作系统的PC机1台
2.PC机系统上安装了Microsoft Visual Studio 2019开发环境
以下是本篇文章正文内容,下面案例可供参考
一、实验要求
针对一幅 BMP 格式的图片文件,统计 256 种不同字节的重复次数,以每种字节重复次数作为权值,构造一颗有 256 个叶子节点的哈夫曼二叉树。
利用上述哈夫曼树产生的哈夫曼编码对图片文件进行压缩。
压缩后的文件与原图片文件同名,加上后缀.huf(保留原后缀),如 pic.bmp,压缩后 pic.bmp.huf。
二、分析与设计
依据上述的实验目的与要求,可导出实现的二叉树与赫夫曼图片压缩软件的流程为:
① 读取图片文件、统计权值
② 生成 Huffman 树
③ 生成 Huffman 编码
④ 压缩图片文件
⑤ 保存压缩的文件
1.数据结构的设计
代码如下(示例):
//定义存储Huffman树的结构体
typedef struct HTNode
{
int weight;//权值
int parent;//父亲节点
int lchild;//左孩子
int rchild;//右孩子
}HTNode, *HuffmanTree;
typedef char** HuffmanCode;//定义哈夫曼编码类型
//文件头
struct HEAD
{
char type[4];//文件类型
int length;//原文件长度
int weight[256];//权值
};
2.核心算法设计
生成Huffman树的算法
代码如下(示例):
void CreateHuffmanTree(HuffmanTree &HT,int* a, int n)//构造哈夫曼树
{
//初始化
HT = new HTNode[2 * n ]; //动态申请2n个空间 ,0号未使用
for (int i = 1; i <= 2 * n-1 ; i++) {
//双亲 ,左右孩子置0
HT[i].parent = HT[i].lchild = HT[i].rchild = 0;
}
for (int i = 1; i <= n; i++) {
//初始化前n个的权值
HT[i].weight = a[i-1]