哈夫曼树构造及编码算法应用之26个字母的哈夫曼编码

/*---------------------------------------------------------------
任务过程:创建26个字母哈夫曼树,及其编码和译码
1、建立哈夫曼树
2、从每个叶结点回溯到root的路径,并记录路径,则为哈夫曼编码
3、查表方式获得每个字符的哈夫曼编码
-----------------------------------------------------------------*/
#include
#include
//----------------------定义结点数据---------------
#define N_LEAVE 26  //N个权值,则有N个叶结点,树共2N-1个结点
#define N_NODE  (26*2-1)
typedef struct _Node
{
	char character;
	float weight;
	int lchild;
	int rchild;
	int parent;
}Node,*pNode;

typedef struct _Code
{
	int HufCode[N_LEAVE];   //叶节点最长编码位数应该为树的最长路径
	int  Start;				 //编码起始位(相对编码数组)
	char Char;				 //编码的字符值
}Code,*pCode;

//--------------------------------------------------

//----------------------构造哈夫曼树----------------
void Huffman(Node Ht[],float Wt[])
{
	int i,j,x1,x2;
	float min1,min2;
	
	//初始化结点数组Ht
	for(i=0;i


总结:

1、学习方法:我决定学习算法要先模仿,后创造,站在前人的肩膀上,没有知识累积的创造和探索是在走歪路。因为在研究这个算法的时候,我看书没有看代码,在理解了原理之后就开始自己编写函数,结果代码又乱又长,而且没能实现。后来,理解了书本的算法,觉得很精彩,突然想到,我自己从头创造的话,是不是在探索前人已经挖地三尺的地方,所以觉得理解,运用就可以了,总之,自己一直在探索,学习内容也是,学习方法也是。

2、数据结构。本程序中的Code、Node都采用了顺序存储,而结构体中的指针全部都是整形,是元素的数组下标。之前我自己设计的时候,没能灵活运用数组,舍本逐末,在结构体中设置的指针是指针类型数据。Node中的parent指针设置很巧妙,不仅作为编码时回溯到root的路径指针,同时也是Huffman算法中创造新结点时,排除下一次查找最小次小权值结点时剔除本次已被合并成小二叉树的两个当前最小次小结点的标志。

3、Code_Ht算法时,我企图省略中间Code结构x,将两步和为一步,结果造成了非法内存访问。

4、Huffman算法中控制N-1次结点合并的部分很精妙,min1、min2、x1、x2的使用结合parent标志元素的使用使算法简单精巧。附1:26个字母使用频率表哈夫曼树构造及编码算法应用之26个字母的哈夫曼编码_第1张图片

附2:本程序数据结构图示哈夫曼树构造及编码算法应用之26个字母的哈夫曼编码_第2张图片

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