【数据结构】哈夫曼树及哈夫曼编码译码

一.原理:

1.      哈夫曼树:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树共有2*n-1个结点(性质)。

2.      哈夫曼树构建:选取权值最小的两个值,将其作为新树的左右子树,且新树的根结点权值为其左右子树根节点权值之和。删除上两棵树,将新树加入森林

 

 

二.思路:

1. 哈夫曼树的建立:根据输入的字符以及权值,按照哈夫曼树的构建过程,首先建立N个叶子结点,建立过程中双亲结点,左右孩子结点全置为0,之后建立剩余结点(不存数据,仅作为储存权值的中间结点)。从n开始循环到2*n-1,选取权值最小的两结点,将其双亲结点位置改为循环量i,同时根结点权值变为两孩子只和并与左右孩子建立连接。

2. 哈夫曼编码:HC二维数组的指针形式,用来存储每一个字符哈夫曼编码串。若为左孩子,则编码为0,右孩子则编码为1。为方便判断,设fa为当前结点父节点,若HT[fa].lch==current,则数组存0,反之存1,存储时数组从高下标端开始,最后应将其复制到另一字符数组中,便于输出。

3. 将明文转变成暗文(编码):输入一串字符,将其转化成形如01010001…形式的暗文。即将每一个字符与之前存储的HT字符数组比较,若相等此时的HC[k][]几位所对应的编码串,最后比较完之后所得到的即整条编码串。

4. 将暗文转变成明文(译码):输入一串形如01010001…形式的暗文,将其转化成有意义的字符串。在根结点按暗文顺序沿哈夫曼树向下走,为0则走左子树,为1则走右子树,当结点左右子树都不存在时,输出此时的字符数据,回溯到根节点。

 

代码:

#include
#include
#include
#include
using namespace std;

typedef struct Node{
	int weight;  //权值 
	int parent;  //父节点序号,0表示根节点 
	int lch,rch; //左右孩子节点序号,0为叶子节点 
	char data;
}HTNode ,*HuffmanTree;//储存每个叶子节点的哈夫曼编码 
typedef char **HuffmanCode;  //储存每个节点的哈夫曼编码 
int n;           //需要编码的字符个数

int min(HuffmanTree HT,int k)
{
	int i=0;
	int min;// 用来存放weight最小且parent为0的元素的下标 
	int min_weight;//temp值
	while(HT[i].parent!=0) i++;
	min_weight=HT[i].weight;
	min=i;
	
	//选出weight最小的且parent为0的元素 ,将其序号赋值给min
	for(;i	fgets(datafile,255,fp1); cout< 
  

 

 

 

你可能感兴趣的:(-----数据结构-----)