文档介绍:-
. z.
实训报告
题 目: 哈夫曼编码和译码系统
院 系:
专 业:
姓 名:
学 号:
指导,右孩子的编码为1,这样就可以通过遍历树来生成字符一一对应的编码表
来到这里,根本上艰辛的已经完成了,对*个具体的字符串编码和解码就只是简单的"查表——替换〞的工作了。
译码: 译码也是个简单的查表--替换过程。如果利用该种编码发送字符串,则它的"字符——编码〞对应表也必须发送过去,然后对给出的一串编码,从左向右,将编码组合起来并查表,一旦找到有匹配的字符,则将当前的编码替换为对应的字符。 因为该编码是不会出现〞*一个字符的编码是另一个字符编码的缀〞这种情况的,也就是不会出现类似于"A 为00而 B 为0010〞 这样的情况,所以译码出来的字符串是唯一的,而且就是原来进展编码的那一个。
-
. z.
CreateHCode
DispHCode
editHCode
CreatHT
HuffmanMenu()
deHCode
取权值最小的两个节点节点
权值小的至于左边,大的置于右边
权值相加
新的节点
For循环直到添加完所有的节点值
构成哈夫曼树
四、详细设计
class Node //节点类
{
public:
friend Hafuman;
char data; //结点值
int weight; //权值
int parent; //双亲结点
int lchild; //左孩子结点
-
. z.
int rchild; //右孩子结点
void CreateHT(Node ht[], int n);
void CreateHCode(Node ht[], Hafuman hcd[], int n);
};
class Hafuman
{
public:
friend Node;
char cd[N]; //存放哈夫曼码
int start; //从start开场读cd中的哈夫曼码
void DispHCode(Node ht[], Hafuman hcd[], int n);
void editHCode(Node ht[], Hafuman hcd[], int n);
void deHCode(Node ht[], Hafuman hcd[], int n);
};
void Node::CreateHT( Node ht[], int n) {
int i, k, lnode, rnode;
int min1, min2;
for (i = 0; i<2 * n - 1; i++)
ht[i].parent = ht[i].lchild = ht[i].rchild = -1; //所有结点的相关域置初值-1
for (i = n; i<2 * n - 1; i++) //构造哈夫曼树
-
. z.
{
min1 = min2 = 32767; //int的围是-32768—32767
lnode = rnode = -1; //记录最小权值的两个结点位置
for (k = 0; k <= i - 1; k++)
{
if (ht[k].parent == -1) //只在尚未构造二叉树的结点中查找
{
if (ht[k].weight<min1) //假设权值小于最小的左节点的权值
{
min2 = min1; rnode = lnode;
min1 = ht[k].weight; lnode = k;
}
else if (ht[k].weight<min2)
{
min2 = ht[k].weight; rnode = k;
}
}
}
ht[lnode].parent = i; ht[rnode].parent = i;