赫夫曼树的构建

赫夫曼树:带权路径最小的二叉树

public class HuffmanTree
{
     publlic class Node implements Comparable<Node >
     {
          int weight;
          Node left = null;
          Node right = null;
          public Node (int weight)
          {
                this.weight = weight;
          }
          //实现Comparable接口是为了能够比较Node中元素的大小
           @Override
        public int compareTo(Node o) 
        {
            return -(this.value - o.value);//从大到小进行排序
        }
     }
     //利用数组创建赫夫曼树
     public Node CreateHuffmanTree(int[] data)
     {
          //先使用数组中的元素创建如果个二叉树(开始时一个元素就是一个二叉树)
          ArrayList<Node> list = new ArrayList<Node>();
          for(int i = 0; i < data.length; i++)
          {
               list.add(new Node(data[i]));
          }
          while(list.size() > 1)
          {
                //对集合list进行排序
                Collections.sort(list);
                //从集合中取出权最小的二叉树
                Node left = list.get(list.size() - 1);
                Node right = list.get(list.size() - 2);
                //将取出的二叉树合并为一颗二叉树
                Node Parent = new Node(left.weight+right.weight);
                Parent.left = left;
                Parent.right = right;
                //从集合中删除取出的这两个节点
                list.remove(left);
                list.remove(right);
                //将新创建的节点添加到集合中
                list.add(Parent);
          }
          //集合中的第一个节点即为赫夫曼树的根节点
          return list.get(0);
     }
     
}

猜你喜欢

转载自blog.csdn.net/rodman177/article/details/89762462