哈夫曼树的最长带权路径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));}


原创粉丝点击