Huffman树的建立过程:

首先得到整个叶子结点的集合:

求Huffman树的带权路径长度算法:

书上讲常见的求Huffman树的带权路径长度算法为:从叶子结点权值乘路径长度:

WPL=7*2+5*2+5*2+3*3+2*3=49

另外一种求WPL的算法为:非叶子几点权值之和:

WPL=22+12+10+5=49

这种方法并不是毫无道理,应为同一个结点下的两个叶子结点的路径长度是一样的,叶子结点的路径长度完全可以反映到其双亲结点上去。

这种算法较为简单,直接可以忽略建树的步骤,直接求出WPL(当然要明白如何求WPL)

算法的主要思想:

1.首先将得到的元素集合进行排序;(降序。升序也行,请自己尝试)

2.数组末尾两个元素求和(俩结点的双亲结点权值),将其结果放在数组倒数第二个位置上并且数组长度减1

3.累加每次求和结果。(即就是非叶子结点的权值)

注意:当集合元素过小时不适用本算法,需要特殊处理,不然会发生数组越界。

C语言实现:

#include<stdio.h>
#include<malloc.h>
// 算法思想:
// 本题主要为求哈夫曼树的带权路径长度,故未将重点放在建树上
// Huffman树的带权路径长其实就是其非叶子结点的权值和//排序算法
void sort(int *data,int n){int i,j;for(i =0;i<n;++i){for (j = 0;  j< n-i; ++j) {if(data[j]<data[j+1]){int t = data[j+1];data[j+1] = data[j];data[j] = t;}}}
}int main() {int n, *data,i,sum =0,x;scanf("%d", &n);//动态开辟数组data = (int *) malloc(sizeof(int)*n);for(i =0;i<n;++i)scanf("%d",&data[i]);if(n<=2){   //当集合过小时,不适用本算法,特殊处理for(i =0;i<n;++i)sum += data[i];printf("%d",data[0]+data[1]);return 0;}while(1){sort(data,n);   //先对数组排序(降序)x=data[n-1]+data[n-2];  //将末尾两元素求和(上层结点权值)data[n-2] = x;  //消除原来两元素,增加新元素sum+=x; //累计非叶子结点权值和--n;    //数组长度减1if(n==1)    //当数组中只剩下一个元素时,得出结果break;}printf("%d\n",sum);
}

运行测试:

求Huffman树的带权路径长度相关推荐

  1. huffman树的带权路径长度

    题目描述 给定n个权值(权值均是大于0的正整数),构造赫夫曼树HT,并求出赫夫曼树HT的带权路径长度. 注意:构造赫夫曼树HT时,在将2棵二叉树合并成一棵新的二叉树时,将根结点权值小的用作左子树! 输 ...

  2. 给定结点权值,求哈夫曼树的带权路径长度和

    1.哈夫曼树概念 一棵树中,从任意一个结点到达另一个结点的通路叫做路径,该路径包含的边的个数称为路径长度,每个结点带有的表示某种意义的值成为权值.从根结点到叶子结点的路径长度乘以叶子节点权值,得到的值 ...

  3. 每天一道数据结构练习题(给定权值求出哈夫曼树的带权路径长度)

    名词解释: 带权路径长度也就是树的带权路径长度,树的路径长度是从树根到树中每一结点的路径长度之和.在结点数目相同的二叉树中,完全二叉树的路径长度最短. 结点的权:在一些应用中,赋予树中结点的一个有某种 ...

  4. 哈夫曼树 和 树的带权路径长度

    树的带权路径长度(Weighted Path Length of Tree):定义为树中所有叶结点的带权路径长度之和. 结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积. 哈夫曼树是一种 ...

  5. 算法学习笔记——数据结构:哈夫曼树、带权路径长度WPL、哈夫曼编码

    引入 合并果子问题如下: 有n堆果子,每次可以合并任意两堆果子,耗费体力值为[两堆果子数之和],最终在n-1次合并后,得到一堆果子. 给出合并的方案,使得耗费的体力值最小 例如有3堆果子,质量依次为1 ...

  6. 自动计算哈夫曼树的带权路径长度

    C语言自动计算哈夫曼树的带权路径长度: #include<stdio.h> #include<stdlib.h> int cmp(const void *a,const voi ...

  7. 哈夫曼树与带权路径长度

    问题: 权值分别为从19,21,2,3,6,7,10,32的结点,构造一棵哈夫曼树,该树的带权路径长度是? 哈夫曼树的一个应用: 压缩字符串https://blog.csdn.net/dyingstr ...

  8. 哈夫曼树(带权路径长度+树的带权路径长度+哈夫曼树定义+构造哈夫曼树+哈夫曼树性质+哈夫曼编码+计算平均码长-这里指WPL)

    带权路径长度 树的带权路径长度WPL 哈夫曼树 哈夫曼树构造 哈夫曼树性质 哈夫曼编码 固定长度编码 可变长编码 前缀编码 固定长度编码.可变长编码.前缀编码.哈夫曼编码 思维倒图 试题

  9. 哈夫曼树的带权路径长度和

    正常想要计算哈夫曼树的路径长度之和,是遍历一遍树,将叶结点的权值乘上深度再加和. 那么对于路径和的计算有这样一个公式: 哈夫曼树的带权路径长度和=等于所有非叶节点的权值和 所以说我们只需要每次将数组前 ...

最新文章

  1. 【ACM】杭电OJ 2050
  2. Redis学习笔记(一)
  3. BUG管理系统(Mantis)迁移实录
  4. PHP面向对象基础总结
  5. [BUUCTF-pwn]——jarvisoj_fm
  6. GMF学习系列(二) 一些知识点(续2)
  7. python中线程和进程_python中线程和进程的简单了解
  8. 一文讲清,MySQL事务隔离级别
  9. 助AI研究社群发出内建18种预先训练模型工具
  10. 疫情下的十大堵城:复工后整体拥堵下降37.3%
  11. 管理新语:员工随口回答,并不是有意忽悠,而是都这样
  12. 一个元素调用css3动画 fixed元素会微抖动
  13. 旋转矩阵与四元数的理解
  14. 如何有效降低网站跳出率
  15. Unity3D协程介绍以及使用
  16. 国标 计算机房 湿度,数据中心机房:温度、湿度标准是什么?
  17. 《Cinema 4D + After Effects动态图形设计案例解析》——1.2 动态图形的历史和发展...
  18. 审计系统---堡垒机项目之表结构设计
  19. matlab 创建批量文件夹_如何在Mac上为照片加水印?水印照片怎样批量处理?
  20. 微服务架构下的可观测性

热门文章

  1. postfix全局通讯录和个人通讯录同步
  2. Spring整合dubbo原理
  3. 入门Python到精通,这一篇文章就够了【精心整理】
  4. GitHub哔哩哔哩(bilibili)当前视频所有Part,整体下载
  5. 贝壳笔试 涂格子最少需要多少种颜料
  6. 概论第6章_正态总体的抽样分布_卡方分布_F分布_t分布
  7. 甲基化检测软件——Tombo
  8. KNN算法的距离公式
  9. 互链周报 | 上周,区块链新项目披露12个,融资项目7个,扶持政策数量增长明显...
  10. 【跟我学oracle18c】第二十五天:Multitenant :15 管理PDBs