首先感谢Mr.Shen的程序!

在哈夫曼树的讲解中,我们使用了一个队列来存储节点,对已使用的节点进行删除,插入新生成的节点,对所有节点的权值进行从小到大的排序,对于这样的一个可以自动排序的队列,我们并不知道如何使用,本节我们使用数组来模拟这个过程。

当队列中只剩一个节点时,哈夫曼树生成就结束了。假设有n个叶子节点,则每次队列中都会减少一个节点,由此可知最后将额外生成n-1个节点。每次生成新的节点时,都需要从存放节点的数组中寻找两个还未使用并且权值最小的节点。

参考如下代码:

#include <iostream>
using namespace std;
const int N=1000;
struct node{int left,right;int weight;//权值int flag;//代表当前节点在构建哈夫曼树的过程中有没有被使用过
} tree[N];//存储每个叶子节点的路径长度
int a[N];//计算每个叶子节点的路径长度
void computeLength(int root,int length){if(tree[root].left==0&&tree[root].right==0){a[root]=length;return;}computeLength(tree[root].left,length+1);computeLength(tree[root].right,length+1);
}//找权值最小的节点
int searchM(int index){int mn=1e9;int p=-1;for(int i=1;i<index;i++){if(tree[i].flag==0&&tree[i].weight<mn){mn=tree[i].weight;p=i;}}return p;
}int main(){int n;//代表叶子节点的数量,构建哈夫曼树的过程中会生成n-1个节点,每一步都会生成一个节点cin>>n;//生成哈夫曼树的n个叶子节点for(int i=1;i<=n;i++){cin>>tree[i].weight;}//生成最终哈夫曼树的总节点数量是n+n-1,n个叶子节点+额外生成的n-1个节点//这n-1个额外生成的节点,放在tree数组的第n+1到2*n-1位置for(int i=n+1;i<=2*n-1;i++){//找两个权值最小的节点int l=searchM(i);//找到一个权值最小的节点,将它的flag设置为1,表示当前节点已经参与了建树过程,以后不再使用tree[l].flag=1;int r=searchM(i);tree[r].flag=1;//生成额外的一个节点,节点的权值为两个子节点的权值之和tree[i].weight=tree[l].weight+tree[r].weight;//设置父子关系tree[i].left=l;tree[i].right=r;//新生成节点,还未参与建树过程,它的flag为0tree[i].flag=0;}//2n-1位置存储的节点为哈夫曼树的根节点computeLength(2*n-1,0);int weightSum=0;for(int i=1;i<=n;i++){weightSum+=tree[i].weight*a[i];}cout<<weightSum;return 0;
}

测试数据:

6
2 3 7 9 18 25

输出:

141

哈夫曼树的生成详解(C++)相关推荐

  1. 数据结构编程实践(七)创建哈夫曼树、生成哈夫曼编码、完成图片的压缩与解压缩

    一.对图片的压缩与解压缩,涉及以下内容: 1.文件读写 2.创建Huffman树 3.生成Huffman编码 4.压缩图片文件 5 .  解压缩图片文件 二.将项目分成三个小任务,下一任务是在上一任务 ...

  2. Qt实现哈夫曼编码解压缩软件详解

    目录 一.概要设计 二:设计效果展示: 三.源代码 1°MainWindow.h 2°MainWindow.cpp 3°Compression.h 4°Compression.cpp 四.软件分析 诸 ...

  3. 哈夫曼树的生成及哈夫曼编码

    首先构造哈夫曼树结构体,初始化哈夫曼树的四个无符号整型域,输入文本,统计各个字符的权值,然后构建哈夫曼树,从根到叶子逆向求哈夫曼树的编码. #include"stdio.h" #i ...

  4. 【Java数据结构与算法】第十二章 哈夫曼树和哈夫曼编码

    第十二章 哈夫曼树和哈夫曼编码 文章目录 第十二章 哈夫曼树和哈夫曼编码 一.哈夫曼树 1.基本术语 2.构建思路 3.代码实现 三.哈夫曼编码 1.引入 2.介绍 3.代码实现哈夫曼编码综合案例 一 ...

  5. Huffman霍夫曼树,霍夫曼编码

    霍夫曼树基本概念: 路径:从一个结点往下到孩子或孙子结点之间的同理 路径长度:如结点1到结点7的路径长度=2 结点的权:将结点的某一属性值作为结点的权 带权路径长度:从根节点到该结点*该结点的权:如结 ...

  6. 数据结构学习——哈夫曼树

    数据结构学习记录DAY13 :哈夫曼树(上) 哈(赫)夫曼树和哈(赫)夫曼编码 路径 一个结点到另外一个结点的通路,称为路径 (祖先结点到子孙结点) 路径长度: 每经过一个结点,路径长度就增加1,不包 ...

  7. 树:赫夫曼树赫夫曼编码

    1,赫夫曼树 1.1,赫夫曼树基本介绍及相关概念 给定n个权值作为n个叶子节点,构造一颗二叉树,若该树的**带权路径长度(WPL)**达到最小,称这样的的二叉树为最优二叉树,也称为赫夫曼树,或者哈夫曼 ...

  8. 树:哈夫曼树和哈夫曼编码的详细介绍以及代码实现

    闲扯前言 哈夫曼编码的代码实现对于初学数据结构的同学可能会有些困难,没有必要灰心,其实没啥,学习就犹如攀登一座又一座的山峰,每当我们攻克一个难点后,回首来看,也不过如此嘛.我们要做的就是不断的去攀越学 ...

  9. 哈夫曼树(C语言实现)

    文章目录 哈夫曼树的基本概念 哈夫曼树的构建 构建思路 代码实现 哈夫曼编码的生成 编码生成思路 代码实现 完整代码展示以及代码测试 哈夫曼树的基本概念 在认识哈夫曼树之前,你必须知道以下几个基本术语 ...

  10. c语言霍夫曼函数,使用C语言详解霍夫曼树数据结构

    1.基本概念 a.路径和路径长度 若在一棵树中存在着一个结点序列 k1,k2,--,kj, 使得 ki是ki+1 的双亲(1<=i 从 k1 到 kj 所经过的分支数称为这两点之间的路径长度,它 ...

最新文章

  1. 潘建伟团队进行人类首次洲际量子通信 都发送了什么
  2. python机器学习实战(一)
  3. layui表格合并单元格多表_layui动态表格之合并单元格
  4. 详细了解BGP—边界网关协议
  5. python xml字符串_python -解析字符串,并返回xml格式字符串 急该如何解决
  6. opencv10-形态学操作
  7. 恢复出厂设置android手机号码,安卓手机怎么恢复出厂设置
  8. Linux命令行设置环境变量
  9. mysql 前沿表设计_史上最简单MySQL教程详解(基础篇)之表的维护和改造
  10. 《unity2021》如何改成中文
  11. 安装FileFormatConverters,出现错误“无法使用此产品的安装源。请确认安装源存在,并且您可以访问它”
  12. Android反编译查看源码
  13. java 分布式序列号_分布式序列号生成?
  14. matlab传递函数带符号变量,符号传递函数matlab
  15. 在网页中插入视频代码大全
  16. 背阔肌(05):史密斯机俯身划船
  17. python编写程序公式计算s_python pandas库和stats库计算偏度和峰度(附程序)
  18. 空气压缩机自动控制Multisim仿真
  19. vivado 时序例外约束
  20. 开源免费的参数化人物角色建模工具MakeHuman1.2.0,大家一起捏人儿吧(附CSDN下载)

热门文章

  1. Intel Optane P4800X评测(序):不用缓存和电容保护的SSD?
  2. UML中依赖(Dependency)和关联(Association)之间的区别
  3. 创建 macvlan 网络 - 每天5分钟玩转 Docker 容器技术(55)
  4. HTML(超文本标记语言)的内容和理解
  5. redis各项功能解决了什么问题
  6. matlab的mkdir创建新的文件夹,并把图像保存在该文件夹内
  7. Asf PHP扩展框架之预警模块介绍
  8. 阿里云三件“法宝”帮助企业应对未来的互联网挑战
  9. BASH系列(2)——变量
  10. GradientDrawable