1. /*
  2. * Copyright (c)2016,烟台大学计算机与控制工程学院
  3. * All rights reserved.
  4. * 文件名称:wu.cpp
  5. * 作    者:陈朋
  6. * 完成日期:2016年11月11日
  7. * 版 本 号:v1.0
  8. *问题描述:实现哈夫曼树的算法验证,并测试数据。
  9. *输入描述:无
  10. *程序输出:测试数据
  11. */
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define N 50        //叶子结点数
  4. #define M 2*N-1     //树中结点总数
  5. //哈夫曼树的节点结构类型
  6. typedef struct
  7. {
  8. char data;  //结点值
  9. double weight;  //权重
  10. int parent;     //双亲结点
  11. int lchild;     //左孩子结点
  12. int rchild;     //右孩子结点
  13. } HTNode;
  14. //每个节点哈夫曼编码的结构类型
  15. typedef struct
  16. {
  17. char cd[N]; //存放哈夫曼码
  18. int start;
  19. } HCode;
  20. //构造哈夫曼树
  21. void CreateHT(HTNode ht[],int n)
  22. {
  23. int i,k,lnode,rnode;
  24. double min1,min2;
  25. for (i=0; i<2*n-1; i++)         //所有结点的相关域置初值-1
  26. ht[i].parent=ht[i].lchild=ht[i].rchild=-1;
  27. for (i=n; i<2*n-1; i++)         //构造哈夫曼树
  28. {
  29. min1=min2=32767;            //lnode和rnode为最小权重的两个结点位置
  30. lnode=rnode=-1;
  31. for (k=0; k<=i-1; k++)
  32. if (ht[k].parent==-1)   //只在尚未构造二叉树的结点中查找
  33. {
  34. if (ht[k].weight<min1)
  35. {
  36. min2=min1;
  37. rnode=lnode;
  38. min1=ht[k].weight;
  39. lnode=k;
  40. }
  41. else if (ht[k].weight<min2)
  42. {
  43. min2=ht[k].weight;
  44. rnode=k;
  45. }
  46. }
  47. ht[i].weight=ht[lnode].weight+ht[rnode].weight;
  48. ht[i].lchild=lnode;
  49. ht[i].rchild=rnode;
  50. ht[lnode].parent=i;
  51. ht[rnode].parent=i;
  52. }
  53. }
  54. //实现哈夫曼编码
  55. void CreateHCode(HTNode ht[],HCode hcd[],int n)
  56. {
  57. int i,f,c;
  58. HCode hc;
  59. for (i=0; i<n; i++) //根据哈夫曼树求哈夫曼编码
  60. {
  61. hc.start=n;
  62. c=i;
  63. f=ht[i].parent;
  64. while (f!=-1)   //循序直到树根结点
  65. {
  66. if (ht[f].lchild==c)    //处理左孩子结点
  67. hc.cd[hc.start--]='0';
  68. else                    //处理右孩子结点
  69. hc.cd[hc.start--]='1';
  70. c=f;
  71. f=ht[f].parent;
  72. }
  73. hc.start++;     //start指向哈夫曼编码最开始字符
  74. hcd[i]=hc;
  75. }
  76. }
  77. //输出哈夫曼编码
  78. void DispHCode(HTNode ht[],HCode hcd[],int n)
  79. {
  80. int i,k;
  81. double sum=0,m=0;
  82. int j;
  83. printf("  输出哈夫曼编码:\n"); //输出哈夫曼编码
  84. for (i=0; i<n; i++)
  85. {
  86. j=0;
  87. printf("      %c:\t",ht[i].data);
  88. for (k=hcd[i].start; k<=n; k++)
  89. {
  90. printf("%c",hcd[i].cd[k]);
  91. j++;
  92. }
  93. m+=ht[i].weight;
  94. sum+=ht[i].weight*j;
  95. printf("\n");
  96. }
  97. printf("\n  平均长度=%g\n",1.0*sum/m);
  98. }
  99. int main()
  100. {
  101. int n=8,i;      //n表示初始字符串的个数
  102. char str[]= {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
  103. double fnum[]= {0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.1};
  104. HTNode ht[M];
  105. HCode hcd[N];
  106. for (i=0; i<n; i++)
  107. {
  108. ht[i].data=str[i];
  109. ht[i].weight=fnum[i];
  110. }
  111. printf("\n");
  112. CreateHT(ht,n);
  113. CreateHCode(ht,hcd,n);
  114. DispHCode(ht,hcd,n);
  115. printf("\n");
  116. return 0;
  117. }

第十一周项目1——二叉树算法验证(4) 哈夫曼编码的算法验证相关推荐

  1. 哈夫曼编码算法 c语言,《哈夫曼编码的算法》

    以前的作业,拿出来看看,都不会了.郁闷 记得当时为了完成这作业,求了一圈朋友,最后还是在图书馆网络中找的!呵呵!在这里晒晒了 设计报告内容: 一. 课程设计名称 <哈夫曼编码的算法> 二. ...

  2. 哈夫曼编码压缩率计算_程序员的算法课(8)-贪心算法:理解霍夫曼编码

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

  3. 程序员的算法课(8)-贪心算法:理解霍夫曼编码

    一.一种很贪婪的算法定义 贪心是人类自带的能力,贪心算法是在贪心决策上进行统筹规划的统称. [百度百科]贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体 ...

  4. C语言Huffman Encode霍夫曼编码的算法(附完整源码)

    C语言Huffman Encode霍夫曼编码的算法 C语言Huffman Encode霍夫曼编码的算法完整源码(定义,实现,main函数测试) C语言Huffman Encode霍夫曼编码的算法完整源 ...

  5. C++实现huffman哈夫曼编码的算法(附完整源码)

    C++实现huffman哈夫曼编码的算法 C++实现huffman哈夫曼编码的算法完整源码(定义,实现,main函数测试) C++实现huffman哈夫曼编码的算法完整源码(定义,实现,main函数测 ...

  6. 二叉树的基本操作及哈夫曼编码/译码系统的实现

    二叉树的基本操作及哈夫曼编码/译码系统的实现 实验目的和要求 掌握二叉树的二叉链表存储表示及遍历操作实现方法. 实现二叉树遍历运算的应用:求二叉树中叶结点个数.结点总数.二叉树的高度,交换二叉树的左右 ...

  7. 第十周 项目一(4)哈夫曼编码的算法验证

    /* Copyright (c)2017,烟台大学计算机与控制工程学院 All rights reserved. 文件名称:第十一周项目1 - 哈夫曼编码算法验证.cpp 作 者:孙仁圆 完成日期:2 ...

  8. 哈夫曼算法以及求哈夫曼编码

    哈夫曼树又称最优树,是一类带权路径长度最短的树.其中带权路径长度WPL最小的二叉树称作最优二叉树或哈夫曼树. 哈夫曼的构造算法: (1):根据给定的n个权值{w1,w2,w3.....},构造n课只有 ...

  9. 哈夫曼编码--贪心算法

    哈夫曼编码(Huffman Coding)是一种编码方式,是一种用于无损数据压缩的熵编码(权编码)算法.1952年,David A. Huffman在麻省理工攻读博士时所发明的,并发表于<一种构 ...

  10. 树与二叉树转换,森林与二叉树的转换,哈夫曼编码例题详解

    二叉树的前序序列和后序序列正好相反,则该二叉树一定是(B) A.空或只有一个结点 B.高度等于其结点数 C.任一结点无左孩子 D.任一结点无右孩子 2.任何一棵二叉树的叶子结点在前序.中序.后序遍历序 ...

最新文章

  1. MongoDB系列:二、MongoDB常用操作练习
  2. 部署SQL AZURE的客户端管理工具,云计算体验之二
  3. gtkorphan清理孤立软件包
  4. 成功解决TypeError: object of type ‘int‘ has no len()
  5. 提高Python运行效率的六个窍门
  6. 最小函数值(信息学奥赛一本通-T1370)
  7. 2021-06-20 pip有时候需要加上--user安装才好使
  8. QT5之MYSQL操作
  9. 程序员的小技能,1行代码修改开机密码、1张图片让你电脑死机
  10. 无法打开登录所请求的数据库 xxxx。登录失败。 用户 'NT AUTHORITY\SYSTEM' 登录失败。...
  11. 【C#】使用OWIN创建Web API
  12. Linux上,最常用的一批命令解析
  13. 服务器虚拟机声卡无法加载,Esxi虚拟机添加声卡
  14. 学模具设计应该掌握哪些内容?
  15. Excel房贷计算表(商贷)1/2
  16. 移动磁盘提示文件名目录名或卷标语法不正确怎么修复?
  17. 微信朋友圈信息流可能采用算法排序吗?
  18. 5月第2周安全回顾 Wi-Fi无线安全建议 微软修补4个漏洞
  19. java基于ssm框架开发的高校实验室预约管理系统实战项目
  20. Java学习——JDBC之从导Jar包到封装

热门文章

  1. Button点击事件的五种写法
  2. 大数据系列之Java调用elasticsearch的增删查改聚合
  3. mysql 视图 统计_mysql 视图
  4. 苹果雪豹操作系统_苹果 M1 版 MacBook 软件兼容实测:VS Code、PhotoShop 目前还不能用(附列表)...
  5. 京东和天猫的运营模式的区别
  6. 快速搜索Wox工具之Everything Service没有运行报错,解决办法!
  7. Skype for business之Skype会议直播
  8. 单例模式及常用使用场景简析
  9. Monitor(二分,二维前缀和板子记录)
  10. c语言中的 #ifndef/#define/#endif的作用