数据结构实验2(设计哈弗曼编码和译码系统)

本文介绍了一个设计哈弗曼编码和译码系统的任务,包括建立哈弗曼树、遍历、生成编码、编码字符串、译码以及打印显示结果的功能。实现过程中涉及到修改二叉树节点以包含指向父节点的指针,使用优先队列和二叉树类,同时提供了对文件操作的复习。
摘要由CSDN通过智能技术生成

设计一个哈弗曼编码和译码系统, 要求如下:

B——建树:读入字符集和各字符频度,建立哈夫曼树。

T——遍历:先序和中序遍历二叉树。

E——生成编码:根据已建成的哈夫曼树,产生各个字符的哈夫曼编码。

C——编码:输入由字符集中字符组成的任意字符串,利用已生成的哈夫曼编码进行编码,显示编码结果,并将输入的字符串及其编码结果分别保存在磁盘文件textfile.txt和codefile.txt中。

D——译码:读入codefile.txt,利用已建成的哈夫曼树进行译码,并将译码结果存入磁盘文件result.txt。

P——打印:屏幕显示文件textfile.txt,codefile.txt,result.txt。

X——退出。



提示: 修改教材中二叉树结点类BTNode, 增加一个指向双亲的parent域, 修改二叉树类的函数MakeTree设置该域的值. 通过遍历哈夫树, 产生每个叶

子结点的哈夫曼编码. 当遍历访问某个叶节点时, 从该叶结点到根的路径可以确定该叶结点所代表的字符的编码.

忘记初始化debug了一晚上, 顺便复习文件操作. 代码用到了优先队列类以及二叉树类.


实现代码:

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "cassert"
#include "fstream"
using namespace std;
template <class T>
class PrioQueue
{
public:
	PrioQueue(int mSize = 0);
	~PrioQueue() { delete []q; }
	bool IsEmpty() const { return n == 0; } // 优先队列为空返回true
	bool IsFull() const { return n == maxSize; } // 优先队列为满返回true
	void Append(const T& x); // 优先队列中添加值为x的元素
	void Serve(T& x); // 优先队列中弹出队列中优先权最高的元素, 并赋值给x
private:
	void AdjustDown(int r, int j); // 向下调整
	void AdjustUp(int j); // 向上调整
	void Print();
	T* q;
	int n, maxSize;
	/* data */
};

template <class T>
void PrioQueue<T>::Print()
{
	for(int i = 0; i < n; ++i)
		cout &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值