数据结构赫夫曼树

/*名称:赫夫曼树语言:数据结构C语言版 编译环境:VC++ 6.0日期: 2014-3-26
*/#include <stdio.h>
#include <limits.h>
#include <malloc.h>
#include <string.h>
#include <windows.h>// 赫夫曼树和赫夫曼编码的存储表示
typedef struct
{unsigned int weight;unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree; // 动态分配数组存储赫夫曼树 typedef char **HuffmanCode; // 动态分配数组存储赫夫曼编码表 // 函数void select()调用
int min1(HuffmanTree t,int i)
{ int j,flag;unsigned int k=UINT_MAX; // 取k为不小于可能的值 for(j = 1; j <= i; j++)if(t[j].weight < k && t[j].parent == 0)k = t[j].weight,flag = j;t[flag].parent=1;return flag;
}// s1为最小的两个值中序号小的那个
void select(HuffmanTree t,int i,int *s1,int *s2)
{ int j;*s1=min1(t,i);*s2=min1(t,i);if(*s1 > *s2){j=*s1;*s1=*s2;*s2=j;}
}// w存放n个字符的权值(均>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC
void HuffmanCoding(HuffmanTree *HT,HuffmanCode *HC,int *w,int n)
{  int m,i,s1,s2,start;unsigned c,f;HuffmanTree p;char *cd;if(n<=1)return;m=2*n-1; //因为一颗有n个叶子结点的赫夫曼树共有2n-1个结点*HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); // 0号单元未用 for(p=*HT+1,i=1;i<=n;++i,++p,++w)    //初始化各结点的权值{(*p).weight=*w;(*p).parent=0;(*p).lchild=0;(*p).rchild=0;}for(;i<=m;++i,++p)    //初始化双亲位置(*p).parent=0;for(i=n+1;i<=m;++i) // 建赫夫曼树 {// 在HT[1 ~ i-1]中选择parent为0且weight最小的两个结点,其序// 号分别为s1和s2 select(*HT,i-1,&s1,&s2);(*HT)[s1].parent=(*HT)[s2].parent=i;(*HT)[i].lchild=s1;(*HT)[i].rchild=s2;(*HT)[i].weight=(*HT)[s1].weight+(*HT)[s2].weight;}// 从叶子到根逆向求每个字符的赫夫曼编码 *HC=(HuffmanCode)malloc((n+1)*sizeof(char*));// 分配n个字符编码的头指针向量([0]不用) cd=(char*)malloc(n*sizeof(char)); // 分配求编码的工作空间 cd[n-1]='\0'; // 编码结束符 for(i=1;i<=n;i++){ // 逐个字符求赫夫曼编码 start=n-1; // 编码结束符位置 for(c=i,f=(*HT)[i].parent; f!=0; c=f,f=(*HT)[f].parent)// 从叶子到根逆向求编码 if((*HT)[f].lchild==c)cd[--start]='0';elsecd[--start]='1';(*HC)[i]=(char*)malloc((n-start)*sizeof(char));// 为第i个字符编码分配空间 strcpy((*HC)[i],&cd[start]); // 从cd复制编码(串)到HC }free(cd); // 释放工作空间
}int main()
{HuffmanTree HT;HuffmanCode HC;int *w,n,i;printf("请输入权值的个数(>1):");scanf("%d",&n);w=(int*)malloc(n*sizeof(int));printf("请依次输入%d个权值(整型):\n",n);for(i=0;i<=n-1;i++)scanf("%d",w+i);HuffmanCoding(&HT,&HC,w,n);for(i=1;i<=n;i++)puts(HC[i]);system("pause");return 0;
}
/*
输出效果:请输入权值的个数(>1):4
请依次输入4个权值(整型):
7 5 2 4
0
10
110
111
请按任意键继续. . . */

运行结果如下:

【数据结构】赫夫曼树相关推荐

  1. 数据结构--赫夫曼树

    数据结构 –赫夫曼树 文章目录 数据结构 一.一些概念 二.最优二叉树(赫夫曼树) 三.赫夫曼树的构造 四.赫夫曼编码 五.前缀编码 一.一些概念 路径:从树中一个结点到另一个结点之间的分支构成这两个 ...

  2. 数据结构 - 赫夫曼树

    wpl最小的就是赫夫曼树(所有叶子节点的带权路径长度之和最小) 写出来两个节点连接,然后循环就可以了 package tree.huffmantree;import java.util.ArrayLi ...

  3. 数据结构--赫夫曼树及其应用

    讲解请参考 赫夫曼 ------ 赫夫曼树和赫夫曼编码的存储表示------ typedef struct {unsigned int weight;unsigned int parent,lchil ...

  4. 数据结构-赫夫曼树(三)

    Huffman Tree 哈夫曼树 霍夫曼树 概念 代码实现: 概念 路径和路径长度: 路径: 从一个节点往下可以达到的子节点或子子节点之间的通路 路径长度: 通路中分支的数目称之为路径长度. 根节点 ...

  5. 2020-10-1 //严蔚敏《数据结构》 //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码

    //严蔚敏<数据结构> //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码 //(从叶子结点到根逆向求每个字符的赫夫曼编码)以及(无栈非递归遍历赫夫曼树,求赫夫曼编码) //自学中 ...

  6. 【赫夫曼树数据结构及其应用】

    本文主要介绍Java中赫夫曼树数据结构的基本原理.实现方式以及使用场景.赫夫曼树(Huffman Tree)是一种带权路径最短的二叉树,广泛应用于数据压缩和编码等领域. 一.赫夫曼树的基本概念 赫夫曼 ...

  7. 数据结构(十五)— 树结构之赫夫曼树及其应用

    现在我们都是讲究效率的社会,什么都要求速度, 在不能出错的情况下,做任何事情都讲究越快越好.在计算机和互联网技术中,文本压缩就是一个非常重要的技术. 玩电脑的人几乎都会应用压缩和解压缩软件来处理文档. ...

  8. java振动数据压缩_【数据结构-Java】最佳实践-数据压缩(使用赫夫曼树)

    一.需求 将给出的一段文本,比如 "i like like like java do you like a java" , 根据前面的讲的赫夫曼编码原理,对其进行数据压缩处理 二. ...

  9. 【赫夫曼树详解】赫夫曼树简介及java代码实现-数据结构07

    赫夫曼树(最优二叉树) 1. 简介 定义: 赫夫曼树是n个带权叶子结点构成的所有二叉树中,带权路径长度(WPL)最小的二叉树. 叶子结点的带权路径: 叶子结点权值*到根节点的路径长度(叶结点的层数) ...

最新文章

  1. Windows Server 2008 Server Core - 小脚印,大安全
  2. 清华大学施路平:发展人工通用智能最好的时机到了!
  3. 关于ewebeditor行距
  4. MySQL数据库管理(二)单机环境下MySQL Cluster的安装
  5. linux 查看服务器网络连接,1.3.2 查看Linux服务器的网络连接(2)
  6. love2d杂记6--动态读写外部lua文件
  7. corpus  academic writing
  8. Python 实现微信小程序的用户登录
  9. 计算机文化基础第三版龙天才课后答案,龙天才
  10. 10 月全国程序员工资统计,一半以上的职位 5 个月没招到人!
  11. 《2018中国AI计算力发展报告》发布!北京算力仅排第二
  12. flutter框架优缺点_小程序框架全面测评
  13. 拓端tecdat|数据预处理之异常值处理
  14. windows环境下安装selenium
  15. React Native导航器之react-navigation使用
  16. 小米note4退出google账号
  17. 服贸会在京举行|淘宝直播携手佳能佳直播联合发布《电商直播高画质开播指南》让品质直播触手可及...
  18. 人家不卡学历,是自己真的没能力
  19. 深秋---Java Map
  20. Yum工具详解(二)-----Yum配置阿里源

热门文章

  1. 嵌入式 Linux 编程
  2. android高德地图marker图标,高德地图自定义Marker显示文字
  3. Hash 哈希 PTA 相关题目解析
  4. 使用 Excel 和 Math.Net 进行曲线拟合和数据预测
  5. linux计划任务1
  6. JFS与JFS2的区别
  7. 开启cdn后导致websocket10秒直接断开连接 报错1006
  8. JAVA SE 005——类型转换
  9. print()和println()的区别
  10. 再看 Kafka Lag