赫夫曼树的构建

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

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);
     }
     
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值