哈夫曼树:

所谓哈夫曼(Huffman)树就是最优二叉树,是带权路径长度WPL最小的二叉树。

哈夫曼树的构造:

根据哈夫曼树的特点:权值越大的结点离根结点越近。
具体方法:依次选择权值最小的二个结点作为左右子树构造一颗新的二叉树,其产生的根结点的权值为左右子树权值之和。一直重复直到只含一棵树为止。‘

权值:

哈夫曼树:

哈夫曼树的存储:

由于哈夫曼树中没有度为1 的结点,则一棵有n个叶子结点的哈夫曼树共有 2n-1个结点,可以存储在一个大小为2n-1的一维数组中。
为了实现方便,数组的0号单元不使用,从1号单元开始使用,所以数组的大小为2n,。将叶子结点集中存储在前面部分 1~n个位置。

代码如下:

#include<stdio.h>
#include<iostream>//哈夫曼树定义
typedef struct {int weight;int parent, lchild, rchild;
}HTNode, *HuffmanTree;//选择两个双亲域为0且权值最小的结点,并返回在HT中的序号s1,s2
void Select(HuffmanTree &HT, int n, int &s1, int &s2)
{//寻找第一个双亲域为0且权值最小的结点int min;for (int i = 1; i <= n; i++)    //找到第一个双亲域为0的,下标暂存到min{if (HT[i].parent == 0){min = i;break;}}for (int i = 1; i <= n; i++){if (HT[i].parent == 0){if (HT[i].weight < HT[min].weight){min = i;}}}s1 = min;//寻找第二个双亲域为0且权值最小的结点for (int i = 1; i <= n; i++)    //找到第一个双亲域为0的,下标暂存到min{if (HT[i].parent == 0 && i != s1){min = i;break;}}for (int i = 1; i <= n; i++){if (HT[i].parent == 0 && i != s1){if (HT[i].weight < HT[min].weight){min = i;}}}s2 = min;
}//输出
void println(HuffmanTree &HT, int m)
{printf("==============================\n");for (int i = 1; i <= m; i++){printf("%d,   ", i);printf("%d   ", HT[i].weight);printf("%d   ", HT[i].parent);printf("%d  ", HT[i].lchild);printf("%d   \n", HT[i].rchild);printf("---------------------------\n");}
}//创建哈夫曼树
void CreateHuffmanTree(HuffmanTree &HT, int n)
{//初始化int i, m = 2 * n - 1, s1, s2;        //m为所有结点的个数if (n <= 1) return;HT = new HTNode[m + 1];             //0号不用从1开始,多申请一行,前1~n存放叶子结点for (i = 1; i <= m; ++i)            //遍历每一个结点并赋值为0{HT[i].parent = 0;HT[i].lchild = 0;HT[i].rchild = 0;}//创建树for (i = 1; i <= n; ++i)          //把叶子结点权值放入表中{printf("请输入第%d个叶子:", i);scanf("%d", &(HT[i].weight));}printf("\nHT的初态\n");println(HT, m);for (int i = n + 1; i <= m; ++i)     //从非叶子结点开始创建{Select(HT, i - 1, s1, s2);        //选择两个最小的结点HT[s1].parent = i;HT[s2].parent = i;               //把叶子结点双亲域赋上HT[i].lchild = s1;HT[i].rchild = s2;HT[i].weight = HT[s1].weight + HT[s2].weight;}printf("\nHT的终态\n");println(HT, m);
}int main() {HuffmanTree HT;int n;                              //n为叶子节点的个数printf("请输入叶子节点的个数:");scanf("%d", &n);CreateHuffmanTree(HT, n);
}

运行结果:

哈夫曼树的构造C/C++代码实现相关推荐

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

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

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

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

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

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

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

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

  5. 哈夫曼树的构造(C语言实现)

    哈夫曼树的构造过程可以详见推荐博客:哈夫曼树以及哈夫曼编码的构造步骤 建议先看完推荐博客中的文字说明,或者自己找一本数据结构的树来仔细阅读以下关于哈夫曼树的构造 然后再来看下面给出的code 这里给出 ...

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

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

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

    哈夫曼树的构造

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

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

  9. 哈夫曼树的构造 java_Java实现哈夫曼树的构造

    哈夫曼树的内容这里不作解释,请自己搜索.下面给出哈夫曼树构造过程的 Java 实现. 结点类: 1./**2. * 二叉树节点3. */4.public class Node implements C ...

最新文章

  1. thinkphp5 使用PHPExcel 导入导出
  2. python实验指导书2018_python实验指导书
  3. 【洛谷】马的遍历--广度优先搜索(BFS)
  4. android下拉刷新和上拉加载的一个简单库
  5. IAR6.1的工程迁移到IAR6.5不能用的解决方法
  6. Linux 解压命令
  7. Linux进程管理(第二版) --计划任务
  8. 华为成了!鸿蒙OS 2.0对比iOS 14:苹果流畅度竟完败?
  9. QuantLib 101之Swap
  10. kafka使用_Kafka精华问答 | kafka的使用场景是什么?
  11. stopped状态的进程 top 命令_Linux 进程管理之四大名捕
  12. 2018-2019-2 网络对抗技术 20165301 Exp 9 Web安全基础
  13. 日志收集神器 Logstash,闪亮登场~
  14. ubuntu下C语言编程的注意点
  15. nodejs gm 中文 linux,nodejs gm drawText使用(中文、字体、大小及颜色)
  16. 索尼NW-A55日版改中文
  17. SQL语句查询:查询本周过生日的信息
  18. 什么是APS?APS+MES如何解决生产难题?
  19. 2、股权融资 - 打造企业上市系列文章
  20. c语言中出现void错误,关于C语言问题

热门文章

  1. 设计模式之命令模式(Java实现)
  2. 小学python都学哪些内容_python是什么?连小学生都开始学Python,你还等什么?
  3. Cglib代理原理剖析
  4. 认知智能真的来了?且看道翰天琼认知智能三大技术体系!认知智能真的来了。
  5. 中国特色小吃英文词汇大全
  6. -bash: !: event not found
  7. 关于Omnet++与NS-3的学习选择讨论(一)
  8. 用Linux内核的瑞士军刀-eBPF实现socket转发offload
  9. 大数据分析技术在新型智慧能源建设中的应用
  10. 非单位时间任务安排问题 贪心 动态规划 回溯