博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构:解读哈夫曼树
阅读量:6276 次
发布时间:2019-06-22

本文共 900 字,大约阅读时间需要 3 分钟。

数据结构:解读哈夫曼树

哈夫曼树简介

在一棵数中,从任意一个结点到达另一个结点的通路被称为路径,改路径上所需经过的边的个数被称为该路径的长度。

给定n个结点和它们的权值,以它们为叶子结点构造一颗带权路径长度和最小的二叉树,该二叉树即为哈夫曼树,同时也被称为最优数。

哈夫曼树的求法

  1. 将所有结点放入集合K。
  2. 若集合K中剩余结点大于2个,则取出其中权值最小的两个结点,构造它们同时为某个新结点的左右子结点,该新结点是他们共同的双亲结点,设定它的权值为其两个儿子结点的权值和。并将该父亲结点放入集合K.重复步骤2 、3。
  3. 若集合K中仅剩余一个结点,该结点即为构造出的哈夫曼树的根节点,所有构造得到的中间结点的权值和即为该哈夫曼树的带权路劲和。
为了方便快捷高效率的求得集合K中权值最小的两个元素,我们需要堆数据结构。它可以以O(logn)的复杂度取得n个元素中的最小元素。为了绕过对堆得实现,我们使用标准模板库中的相应的标准模板 —— 优先队列
priority_queue<int> Q
这样建立的堆其默认为大顶锥,而在哈夫曼树中,我们恰恰需要取得堆中最小的元素,预算我们使用如下语句定义一个小顶堆。
priority_queue<int, vector<int>,greater<int>> Q

代码块

priority_queue
,greater
> Q; //建立一个小顶堆int main(){ int n; while(scanf("%d",&n)!=EOF){ while(Q.empty()==false) Q.pop(); //清空堆中的元素 for(int i=1;i<=n;i++){ //输入n个叶子结点权值 int x; scanf("%d",&x); //讲权值放入堆中 Q.push(x); } int ans=0; while(Q.size()>1){ int a=Q.top(); Q.pop(); int b=Q.top(); Q.pop(); ans+=a+b; Q.push(a+b); } printf("%d\n",ans); } return 0;}

转载地址:http://ttgpa.baihongyu.com/

你可能感兴趣的文章
solrCloud+tomcat+zookeeper集群配置
查看>>
/etc/fstab,/etc/mtab,和 /proc/mounts
查看>>
Apache kafka 简介
查看>>
socket通信Demo
查看>>
技术人员的焦虑
查看>>
js 判断整数
查看>>
建设网站应该考虑哪些因素
查看>>
mongodb $exists
查看>>
js实现页面跳转的几种方式
查看>>
sbt笔记一 hello-sbt
查看>>
常用链接
查看>>
pitfall override private method
查看>>
springMVC数据绑定
查看>>
!important 和 * ----hack
查看>>
聊天界面图文混排
查看>>
控件的拖动
查看>>
svn eclipse unable to load default svn client的解决办法
查看>>
Android.mk 文件语法详解
查看>>
nGrinder3.2重磅发布
查看>>
QT liunx 工具下载
查看>>