设计一个哈弗曼编码和译码系统, 要求如下:
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 &