哈夫曼树算法实现并输出每个字符的哈夫曼编码

1.算法设计思想及功能模块
      给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。对于这种陆续找出两个最小权值的算法可以利用排序的方式,从小到大排序,那么最左边的就是最小的,这样一来最小的权值可以挑选出来了,接下来再利用特定的结构体(都有左孩子和右孩子还有存放权值的data域)让每一个权值结点存在一个数组中。这样子不断的操作数组,从数组中的5个元素到只有1个元素为止,此时的这一个元素就是二叉树的跟。然后再利用遍历方式打印这个二叉树即可。
      根据哈夫曼树构建要求,选取权值最小的两个节点结合,新节点加入数组,再继续选取最小的两个节点继续构建。
2.关键模块流程图
哈夫曼树算法实现并输出每个字符的哈夫曼编码_第1张图片
3.算法时间及空间复杂度分析
取决于叶子节点个数,时间复杂度O(n),空间复杂度O(1).
4.源代码

#include
#define n 5
#define m (2*n-1)    //结点总数
#define maxval 10000.0
#define maxsize 100   //哈夫曼编码的最大位数
typedef struct
{
 char ch;
 float weight;
 int lchild,rchild,parent;
}hufmtree;
typedef struct
{
 char bits[n];   //位串
 int start;      //编码在位串中的起始位置
 char ch;        //字符
}codetype;

void huffman(hufmtree tree[]);//建立哈夫曼树
void huffmancode(codetype code[],hufmtree tree[]);//根据哈夫曼树求出哈夫曼编码

void main()
{
 printf("                            ——哈夫曼编码——\n");
 printf("总共有%d个字符\n",n);
 hufmtree tree[m];			//建立哈夫曼树
 codetype code[n];			//根据哈夫曼树求出哈夫曼编码
 int i,j;//循环变量
 huffman(tree);//建立哈夫曼树
 huffmancode(code,tree);//根据哈夫曼树求出哈夫曼编码
 printf("【输出每个字符的哈夫曼编码】\n");
 for(i=0;i

哈夫曼树算法实现并输出每个字符的哈夫曼编码_第2张图片

参考https://blog.csdn.net/l494926429/article/details/52494926

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