哈夫曼树的最长带权路径WPL算法
来源:互联网 发布:软件可用性 编辑:程序博客网 时间:2024/06/05 08:38
1.题目
给出一组树节点集合(每个节点均有权值),求其最长带权路径
2.思路
1)首先利用给出的集合构造Huffman树
将原节点集合按其权值从小到大排序,之后每次抽取前两个(最小权值)的节点剔除集合,并将两个权值想加之后赋给新的节点,再将新节点插入集合中。一直重复上述步骤直到集合中只有一个节点
2)利用Huffman树的特性求WPL
由哈夫曼树的特性可知,其数据节点均是叶子节点,且WPL=∑节点权值 * 节点深度。由此可结合树的前序遍历得到解法。
3.代码
static class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int val) {this.val = val;}}//快排static void qSort(List<TreeNode> listNode,int low,int high){if(low < high){int i=low,j=high;TreeNode temp = listNode.get(low);while(i < j){while(temp.val<listNode.get(j).val && i<j)j--;listNode.set(i, listNode.get(j));while(temp.val>listNode.get(i).val && i<j)i++;listNode.set(j, listNode.get(i));}listNode.set(i, temp);qSort(listNode,low,i-1);qSort(listNode,i+1,high);}}//构造哈夫曼树static TreeNode huffmanTree(List<TreeNode> listNode){//对初始节点数组进以val值从小到大的排序qSort(listNode,0,listNode.size()-1);int size = listNode.size();TreeNode min1;TreeNode min2;TreeNode newNode;//当集合中不止一个节点(即未合并完成)while(listNode.size() > 1){//拿到两个当前最小val值节min1 = listNode.get(0);listNode.remove(0);min2 = listNode.get(0);listNode.remove(0);newNode = new TreeNode(min1.val + min2.val);newNode.left = min1;newNode.right = min2;listNode.add(newNode);qSort(listNode,0,listNode.size()-1);}return listNode.get(0);}//递归求解WPLstatic int WPL(TreeNode root,int deep,int wpl){if(root != null){//当遍历到叶节点则直接输出当前权值*深度if(root.left==null && root.right==null){ wpl += root.val * deep; return wpl;}else{wpl += WPL(root.left,deep+1,wpl)+WPL(root.right,deep+1,wpl);return wpl;}}else return 0;}public static void main(String[] args) {TreeNode t1 = new TreeNode(1);TreeNode t2 = new TreeNode(3);TreeNode t3 = new TreeNode(5);TreeNode t4 = new TreeNode(8);TreeNode t5 = new TreeNode(6);TreeNode t6 = new TreeNode(7);List<TreeNode> listNode = new ArrayList<TreeNode>();listNode.add(t1);listNode.add(t2);listNode.add(t3);listNode.add(t4);listNode.add(t5);listNode.add(t6);TreeNode root = huffmanTree(listNode);System.out.println(WPL(root,0,0));}
阅读全文
0 0
- 哈夫曼树的最长带权路径WPL算法
- 哈夫曼树 带权路径长度WPL
- 哈夫曼(Huffman)树创建及其带权路径长度(WPL)、哈夫曼编码、哈夫曼解码
- 图算法之图的最长路径
- WPL
- 哈夫曼树的建立、编码以及WPL值的计算
- 小顶堆_优先队列 ,实现哈夫曼树的WPL求值
- 递归求huffman树的叶子结点的加权路径长度wpl
- 哈夫曼树的带权路径长度
- 给定权值 {19,01,23,14,55,20,84,27 },构造相应的哈夫曼树,计算WPL.
- 九度:1172<哈夫曼树WPL>
- WPL算法(二叉树问题)
- 最长非降 nlogn 带路径标记
- 图的最长路径
- 图的最长路径
- HDU1160 FatMouse's Speed 带路径的最长上升子序列问题
- 算法2:树的带权路径长度(创新工场)
- 算法题15 二叉树的最长的路径长度&&最大路径和
- Python 爬虫实战(2):股票数据定向爬虫
- MYSQL-Date相关函数
- MySQL存储过程
- NumberFormatException
- 判断输入字符类型,汉字转拼音
- 哈夫曼树的最长带权路径WPL算法
- EasyUI datebox datetimebox的自定义按钮 按条件设置日期的不可用 js日期计算
- web项目读取classpath下面文件
- 数据库——游标
- DDOS攻击 — 棋牌游戏创业公司的生死劫
- DAO层,Service层,Controller层、View层
- LR中判断HTTP返回状态码
- 策略模式
- 初识--AOP