哈夫曼树的构造过程可以详见推荐博客:哈夫曼树以及哈夫曼编码的构造步骤

建议先看完推荐博客中的文字说明,或者自己找一本数据结构的树来仔细阅读以下关于哈夫曼树的构造

然后再来看下面给出的code

这里给出的是关于哈夫曼树的构造代码:

#include <cstdio>
#include <cstring>
using namespace std;typedef struct {int weight;         // 结点权值?int parent, lc, rc; // 双亲结点和左 右子节点
} HTNode, *HuffmanTree;void Select(HuffmanTree &HT, int n, int &s1, int &s2)
{int minum;      // 定义一个临时变量保存最小值?for(int i=1; i<=n; i++)     // 以下是找到第一个最小值{if(HT[i].parent == 0){minum = i;break;}}for(int i=1; i<=n; i++){if(HT[i].parent == 0)if(HT[i].weight < HT[minum].weight)minum = i;}s1 = minum;// 以下是找到第二个最小值,且与第一个不同for(int i=1; i<=n; i++)     {if(HT[i].parent == 0 && i != s1){minum = i;break;}}for(int i=1; i<=n; i++){if(HT[i].parent == 0 && i != s1)if(HT[i].weight < HT[minum].weight)minum = i;}s2 = minum;
}void CreatHuff(HuffmanTree &HT, int *w, int n)
{int m, s1, s2;m = n * 2 - 1;  // 总结点的个数HT = new HTNode[m + 1]; // 分配空间for(int i=1; i<=n; i++) // 1 - n 存放叶子结点,初始化{HT[i].weight = w[i];HT[i].parent = 0;HT[i].lc = 0;HT[i].rc = 0;}for(int i=n+1; i<=m; i++)   // 非叶子结点的初始化{HT[i].weight = 0;HT[i].parent = 0;HT[i].lc = 0;HT[i].rc = 0;}printf("\nthe HuffmanTree is: \n");for(int i = n+1; i<=m; i++)     // 创建非叶子节点,建哈夫曼树{   // 在HT[1]~HT[i-1]的范围内选择两个parent为0且weight最小的两个结点,其序号分别赋值给 s1 s2Select(HT, i-1, s1, s2);HT[s1].parent = i;  // 删除这两个结点HT[s2].parent = i;HT[i].lc = s1;      // 生成新的树,左右子节点是 s1和s2HT[i].rc = s2;HT[i].weight = HT[s1].weight + HT[s2].weight;   // 新树的权�?printf("%d (%d, %d)\n", HT[i].weight, HT[s1].weight, HT[s2].weight);}printf("\n");
}int main()
{HuffmanTree HT;int *w, n, wei;printf("input the number of node\n");scanf("%d", &n);w = new int[n+1];printf("\ninput the %dth node of value\n", n);for(int i=1; i<=n; i++){scanf("%d", &wei);w[i] = wei;}CreatHuff(HT, w, n);return 0;
}

哈夫曼树的构造(C语言实现)相关推荐

  1. c语言最优树的构造,哈夫曼树的构造及编码 Haffman树的构造及其编码

    写出构造完整的哈夫曼树的编码 void HuffmanCoding(HuffmanCode HC[], int w[], int n) // w存放n个字符的权值(均>0),构造哈夫曼树HT, ...

  2. 哈夫曼树的构造及C++代码实现

    哈夫曼树的构造过程: (1) 以权值分别为W1,W2...Wn的n各结点,构成n棵二叉树T1,T2,...Tn并组成森林F={T1,T2,...Tn},其中每棵二叉树 Ti仅有一个权值为 Wi的根结点 ...

  3. 数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)

    目录 什么是哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 图解操作 代码实现 代码解析 哈夫曼树的特点 哈夫曼编码 不等长编码 二叉树用于编码 哈夫曼编码实例 什么是哈夫曼树 我们先举个例子: 要将百分制 ...

  4. 哈夫曼树的构造算法代码

    代码: #include<stdio.h> #define ERROR 0 #define OK 1 typedef int Status; //采用顺序存储结构,一维结构数组 //定义结 ...

  5. 哈夫曼树的构造C/C++代码实现

    哈夫曼树: 所谓哈夫曼(Huffman)树就是最优二叉树,是带权路径长度WPL最小的二叉树. 哈夫曼树的构造: 根据哈夫曼树的特点:权值越大的结点离根结点越近. 具体方法:依次选择权值最小的二个结点作 ...

  6. 数据结构教程—哈夫曼树的构造算法

    哈夫曼树算法如下 (1)根据给定的n个权值,使对应节点构成n棵二叉树的森林,其中每棵二叉树都只有一个根节点,其左右子树均为空. (2)在森林中选取两棵节点权值最小的子树分别作为左右子树构造一棵新的二叉 ...

  7. 哈夫曼树的构造(手写图解)

    哈夫曼树的构造

  8. 哈夫曼树的构造及应用

    哈夫曼树的构造及应用 文章目录 哈夫曼树的构造及应用 带权路径长度 哈夫曼树定义 哈夫曼树的性质: 构造哈夫曼树 构造哈夫曼树存储及生成算法 算法框架 代码实操: 应用: 哈夫曼编码 带权路径长度 设 ...

  9. 哈夫曼树的构造(C语言)

    #include<stdio.h> #include<stdlib.h> #include<math.h> struct HTreeNode{int parent; ...

最新文章

  1. 航天智慧物流线上预选赛-成绩公布
  2. c/c++中typedef与函数指针
  3. 物联网可编程高灵活度IoT网关或集线器是解决方案
  4. 洛谷P3791:普通数学题(整除分块、前缀和)
  5. LINUX下用YUM安装nginx出现No package nginx available.的问题与解决方案
  6. sqlite可视化工具推荐
  7. POJ 1451 T9 (字典树好题)
  8. 国家机构测评主流电视品牌语音识别 长虹Q5K综合评价最佳
  9. hashcode值一样对象一定相同吗_你所不知道的HashCode
  10. mysql or order by_MySQL 2 SQL数据使用(检索、排序、过滤:SELECT/FROM/LIMIT/ORDER BY/DESC/WHERE/AND/OR/IN/NOT)...
  11. 顶会两篇论文连发,华为云医疗AI低调中崭露头角
  12. java web 实战开发经典_java web 开发实战经典(一)
  13. 管家婆 凭证查找 Date exceeds maximum of 19-12-31 报错管家婆 打开经营历程 Date exceeds maximum of 19-12-31 报错
  14. 中文汉字错别字纠错方法
  15. cs服务器(cs索沛服务器)
  16. 机器学习超详细实践攻略(9):手把手带你使用决策树算法与调参
  17. 【SIGGRAPH】用【有说服力的照片真实】技术实现最终幻想15的视觉特效
  18. nginx 启动、重启、配置重新加载
  19. 编程之美 1.2 中国象棋将帅问题
  20. Moveit配置方法

热门文章

  1. Spring Cloud H (五)初战服务降级和熔断Hystrix(豪猪哥)
  2. Nginx同时支持Http和Https的配置
  3. 【ARM64】DTB地址从uboot传递到kernel的流程
  4. python培训机构怎么比较靠谱
  5. void函数为什么还能返回(不能返回前面理解错误)
  6. 对于做生意的一些看法和想法
  7. zookeeper常用命令行操作
  8. 在Windows Mobile上运行J2SE/J2ME!!!!!
  9. 新房装修步骤及注意事项,让您有准备的装修步骤
  10. 游乐场预约管理系统分析与设计