武汉理工大学数据结构综合实验——二叉树与赫夫曼图片压缩


实验目的

 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];
  • 0
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1.实验目的 通过“图片压缩编码”的编程实践,学习树、遍历二叉树、哈夫曼树、哈夫曼编码和他们的编程应用。 (1)掌握树的存储结构 (2)掌握二叉树的三遍历方法 (3)掌握并理解Huffman树、Huffman编码等知识和应用 (4)掌握文件的操作 (5)使用Huffman算法实现图像压缩程序 2.实验内容 使用Huffman压缩算法,对一幅BMP格式图片文件进行压缩。图片文件名为“Pic.bmp”,压缩后保存为“Pic.bmp.huf”文件。使用VS2010作为开发工具,开发一个控制台程序,使用Huffman压缩算法对图片文件“Pic.bmp”进行压缩。具体要求如下: (1)读取原文件统计权值: 运行程序,输入文件名。 以“Pic.bmp文件为例。若文件存放在F盘根目录下,输入文件完整路径“F:\Pic.bmp”。按回车结束。以字节流的方式,只读打“Pic.bmp文件。 逐字节读取文件统计文件256字节重复次数,保存到一个数组中int weight[256]中。 (2)生成Huffman树 根据(1)中统计的结果,构建Huffman树。定义一个结构体来记录每个节点的权值、父节点、左孩子和右孩子。使用结构体数组来存储这个Huffman树。 (3)生成Huffman编码 遍历(2)中生成的Huffman树,记录256个叶子节点的Huffman编码,保存在字符串数组中。 (4)压缩原文件 使用Huffman编码对原文件中的字节重新编码,获得压缩后的文件数据。 (5)保存压缩文件 将编码过的数据,保存到文件“Pic.bmp.huf”中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值