zoukankan      html  css  js  c++  java
  • 树结构(三)---赫夫曼树

      赫夫曼树又称为最优二叉树:它是n个带权叶子节点构成的所有二叉树中,带权路径长度最小的二叉树。

      赫夫曼数=树的带权路径长度WPL:树中所有叶子节点的带权路径长度之和  (带权路径是:叶子节点的数值乘经过的子节点数量)

      

          

    1、

     1 package demo9;
     2 
     3 public class Node implements Comparable<Node>{
     4     int value;
     5     Node left;
     6     Node right;
     7     
     8     public Node(int value){
     9         this.value=value;
    10     }
    11 
    12     @Override
    13     public int compareTo(Node o) {
    14         return -(this.value-o.value);
    15     }
    16 
    17     @Override
    18     public String toString() {
    19         return "Node [value=" + value + "]";
    20     }
    21 
    22     
    23     
    24 }

    2、

     1 package demo9;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Arrays;
     5 import java.util.Collections;
     6 import java.util.List;
     7 
     8 public class TestHuffmanTree{
     9     public static void main(String[] args){
    10         int[] arr={3,7,8,29,5,11,23,14};
    11         Node node=createHuffmanTree(arr);
    12         
    13         System.out.println();
    14     }
    15     
    16     //创建赫夫曼数
    17     public static Node createHuffmanTree(int[] arr){
    18         //先使用数组中所有的元素创建若干个二叉树,(只有一个节点)
    19         List<Node> nodes=new ArrayList<Node>();
    20         for(int value:arr){
    21             nodes.add(new Node(value));
    22         }
    23         //循环处理
    24         while(nodes.size()>1){            
    25             //排序
    26             Collections.sort(nodes);
    27             //取出来权值最小的两个的二叉树
    28             Node left=nodes.get(nodes.size()-1);
    29             //取出最权值次小的二叉树
    30             Node right=nodes.get(nodes.size()-2);
    31             //创建一颗新的二叉树
    32             Node node2=new Node(left.value+right.value);
    33             //把取出来的两个二叉树移除
    34             nodes.remove(left);
    35             nodes.remove(right);
    36             //放入原来的二叉树集合中            
    37             nodes.add(node2);
    38         }
    39         return nodes.get(0);
    40     }
    41 }
    好好学习,天天向上。 努力工作,给自己的和家人一个满意的答案。。。。
  • 相关阅读:
    广域网(ppp协议、HDLC协议)
    0120. Triangle (M)
    0589. N-ary Tree Preorder Traversal (E)
    0377. Combination Sum IV (M)
    1074. Number of Submatrices That Sum to Target (H)
    1209. Remove All Adjacent Duplicates in String II (M)
    0509. Fibonacci Number (E)
    0086. Partition List (M)
    0667. Beautiful Arrangement II (M)
    1302. Deepest Leaves Sum (M)
  • 原文地址:https://www.cnblogs.com/axu521/p/9992539.html
Copyright © 2011-2022 走看看