题目来源于南师大gis考研,由于网上的代码多数是基于静态链表来完成的,而静态链表本身又是南师的低频考点。而哈夫曼树又是南师的重点考点,若考虑使用静态链表完成,则需要深入学习静态链表的知识。
若如此做,则将一个考点变成了两个考点,增加了备考负担。
但是若学有余力,静态链表也值得一学,因为曾经单独出过静态链表的题目(十几年就出过一次)
因此我选择用一些常用的知识来构建哈夫曼树:
首先是哈夫曼树的节点:成员变量包括,数据变量,左右孩子指针。(按照题目需要可以增加父亲节点)
然后构建一个哈夫曼节点数组。
该数组用于储存还未成树的节点,或者由两个旧节点组合出的新节点。
然后编写一个排序函数,用于对哈夫曼节点数组排序,使得哈夫曼节点按照数据由大到小排,则每次选出最后两个节点,即可进行哈夫曼树的构建。
然后就是利用递归函数构建哈夫曼树(非常简单,一看就懂)。
typedef struct HFNode{//建立哈夫曼树的节点
int data;
struct HFNode *rchild,*lchild;
};
HFNode HFtree[MaxSize];//建立一个保存初始叶节点的数组,并在此数组的基础上进行哈夫曼树的构造
void HFNode_sort(HFNode H[]){
int flat=0;
int len=length(H);//获得数组有效元素的个数
for(int i=len-1;i>1;i--){//冒泡排序对节点数组进行排序,按由大到小排
flat=0;//创建一个元素用于记录某一趟是否有元素交换
for(int j=i;j>=len-i;j-