哈夫曼树的java实现

来源:互联网 发布:淘宝店现在还挣钱么 编辑:程序博客网 时间:2024/06/02 04:22

首先:定义哈夫曼树的节点类,为了方便使用集合类的排序功能,实现了Comparable接口(可以不是实现该接口,此时需要实现排序功能)

[java] view plaincopy
  1. package my.huffmanTree;  
  2.   
  3. public class Node<T> implements Comparable<Node<T>> {  
  4.     private T data;  
  5.     private double weight;  
  6.     private Node<T> left;  
  7.     private Node<T> right;  
  8.       
  9.     public Node(T data, double weight){  
  10.         this.data = data;  
  11.         this.weight = weight;  
  12.     }  
  13.       
  14.     public T getData() {  
  15.         return data;  
  16.     }  
  17.   
  18.     public void setData(T data) {  
  19.         this.data = data;  
  20.     }  
  21.   
  22.     public double getWeight() {  
  23.         return weight;  
  24.     }  
  25.   
  26.     public void setWeight(double weight) {  
  27.         this.weight = weight;  
  28.     }  
  29.   
  30.     public Node<T> getLeft() {  
  31.         return left;  
  32.     }  
  33.   
  34.     public void setLeft(Node<T> left) {  
  35.         this.left = left;  
  36.     }  
  37.   
  38.     public Node<T> getRight() {  
  39.         return right;  
  40.     }  
  41.   
  42.     public void setRight(Node<T> right) {  
  43.         this.right = right;  
  44.     }  
  45.   
  46.     @Override  
  47.     public String toString(){  
  48.         return "data:"+this.data+";weight:"+this.weight;  
  49.     }  
  50.   
  51.     @Override  
  52.     public int compareTo(Node<T> other) {  
  53.         if(other.getWeight() > this.getWeight()){  
  54.             return 1;  
  55.         }  
  56.         if(other.getWeight() < this.getWeight()){  
  57.             return -1;  
  58.         }  
  59.           
  60.         return 0;  
  61.     }  
  62. }  

然后:实现哈夫曼树的主题类,其中包括两个静态的泛型方法,为创建哈夫曼树和广度优先遍历哈夫曼树

[java] view plaincopy
  1. package my.huffmanTree;  
  2.   
  3. import java.util.ArrayDeque;  
  4. import java.util.ArrayList;  
  5. import java.util.Collections;  
  6. import java.util.List;  
  7. import java.util.Queue;  
  8.   
  9. public class HuffmanTree<T> {  
  10.     public static <T> Node<T> createTree(List<Node<T>> nodes){  
  11.         while(nodes.size() > 1){  
  12.             Collections.sort(nodes);  
  13.             Node<T> left = nodes.get(nodes.size()-1);  
  14.             Node<T> right = nodes.get(nodes.size()-2);  
  15.             Node<T> parent = new Node<T>(null, left.getWeight()+right.getWeight());  
  16.             parent.setLeft(left);  
  17.             parent.setRight(right);  
  18.             nodes.remove(left);  
  19.             nodes.remove(right);  
  20.             nodes.add(parent);  
  21.         }  
  22.         return nodes.get(0);  
  23.     }  
  24.       
  25.     public static <T> List<Node<T>> breadth(Node<T> root){  
  26.         List<Node<T>> list = new ArrayList<Node<T>>();  
  27.         Queue<Node<T>> queue = new ArrayDeque<Node<T>>();  
  28.           
  29.         if(root != null){  
  30.             queue.offer(root);  
  31.         }  
  32.           
  33.         while(!queue.isEmpty()){  
  34.             list.add(queue.peek());  
  35.             Node<T> node = queue.poll();  
  36.               
  37.             if(node.getLeft() != null){  
  38.                 queue.offer(node.getLeft());  
  39.             }  
  40.               
  41.             if(node.getRight() != null){  
  42.                 queue.offer(node.getRight());  
  43.             }  
  44.         }  
  45.         return list;  
  46.     }  
  47. }  

最后:编写一共测试端

[java] view plaincopy
  1. package my.huffmanTree;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. public class Test {  
  7.     public static void main(String[] args) {  
  8.         // TODO Auto-generated method stub  
  9.         List<Node<String>> list = new ArrayList<Node<String>>();  
  10.         list.add(new Node<String>("a",7));  
  11.         list.add(new Node<String>("b",5));  
  12.         list.add(new Node<String>("c",4));  
  13.         list.add(new Node<String>("d",2));  
  14.           
  15.         Node<String> root = HuffmanTree.createTree(list);  
  16.         System.out.println(HuffmanTree.breadth(root));  
  17. //      System.out.println(list);  
  18.     }  
  19. }  

其中添加四个节点,其权重为{7,5,4,2},最终按照广度优先遍历,应为七个节点,为:18,7,11,5,6,2,4;

控制台输出为:

[data:null;weight:18.0, data:a;weight:7.0, data:null;weight:11.0, data:b;weight:5.0, data:null;weight:6.0, data:d;weight:2.0, data:c;weight:4.0]

与实际想符合。

0 0
原创粉丝点击