通过哈夫曼树的编码与译码的简单实现

通过哈夫曼树进行编码与译码,首先要明确,
* 哈夫曼编码的作用,哈夫曼编码是通过用01编码来代替原来的字符,从而实现了压缩.
* 哈夫曼编码是通过哈夫曼树中获取到的

要构建哈夫曼树,首先就需要获得所输入字符的种类,以及各种字符出现次数,从而让这些出现次数作为权值来构建哈夫曼树. 例如现在要对aadddddffff进行压缩,
* 首先获得输入字符的种类有3种,分别为a d f
* 对应的频率为:a 2;b 5;f 4
* 构建出来的哈夫曼树如图:(构建哈夫曼树的目的就是获得不同种类字符的哈夫曼编码)
通过哈夫曼树的编码与译码的简单实现_第1张图片
获得了哈夫曼树,因此就可以获得这些字符的哈夫曼编码,所以a d f的哈夫曼编码为:
* a:11
* d:0
* f:10

可以看出哈夫曼编码就是前缀编码,因此在译码的时候不会产生错乱.
* 通过哈夫曼编码,就可以把输入的字符aadddddffff翻译成11110000010101010

获得字符的编码后,就对该编码进行译码,既然编码是通过哈夫曼树获得的,那么译码也就可以通过哈夫曼树来处理(哈夫曼树就是字符与编码的映射表)因此译码的方式可以将编码依次通过哈夫曼树来进行译码具体实现方式为: 将11110000010101010从头依次遍历i标记当前遍历到的字符,用c初始化标记哈夫曼树的根节点当str[i]为0,则c标记当前结点HuffmanTree[c]的左孩子,即c=HuffmanTree[c].lchild,如果是1则c=HuffmanTree[c].rchild按以上处理方式,一直让c标记到叶子结点,则前i个编码已经译码成功,c重新标记树根,i继续往下遍历,进行处理.

  • 译码的伪代码:

while(i c=2*n-1; //c标记哈夫曼树的根节点
while(huffmanTree[c].lchild!=0&&huffmanTree[c].rchild!=0){//只要还没遍历到根节点就继续译码
if(str[i]‘0’){ //0就指向左孩子
c=huffmanTree[c].lchild;
}else if(str[i]
‘1’){ //1就指向右孩子
c=huffmanTree[c].rchld;
}
}
//以上循环结束,则说明,c已经遍历到叶子节点了,输出该叶子节点的字符,就是编码对应的一个字符
cout< }
*
编码与译码的完整代码:

#include 
#include
#include
#include
#include

#define MAXSIZE 100//用于定义统计字符频率数组的大小
#define MAXVALUE  0x7fffffff //定义整型变量的最大值
using namespace std;

//哈夫曼树的结点结构,最终利用该类型的数组来保存生成的哈夫曼树
typedef struct{

//结点的权值
int weight;
//该权值对应的字符
char ch;
//该结点的左孩子和右孩子以及父亲的下标,记录父亲的位置主要是用于生成哈夫曼编码
int lchild,rchild,parent;
}HTNode ,*HuffmanTree;

//定义保存每个字符的哈夫曼编码的字符串数组
typedef char **HuffmanCode;

//用来保存输入的字符
string str;
//全局变量用于统计字符出现的频率
int str_fq[MAXSIZE];

//用于保存输入的字符一共有多少种类型
int num;


//全局变量以数组形式保存生成的哈夫曼树
HuffmanTree HT;
//以字符串数组的形式来保存字符的哈夫曼编码
HuffmanCode HC;
//以map的形式保存字符的哈夫曼编码
map huffmanCodeMap;

//将用户输入的字符串变为01编码
string huffmanCodeStr;


void printStr_fq(){
  cout<<"显示输入字符的频率:"<>str;
   cout<<"你输入的字符是:"<>select;
switch(select){
case 1:
  decodingByHuffmanTree(huffmanCodeStr);
case 2:
    cout<<"请输入你的编码:"<>str;
    decodingByHuffmanTree(str);
}

}
*/



int main()
{
createHuffmanTree();
getHuffmanCode();
showHuffmanCode();
codingForStr();

decodingByHuffmanTree();
    return 0;
}

你可能感兴趣的:(数据结构,哈夫曼树的编码与译码)