哈夫曼编码
使用Java语言实现哈夫曼编码
import java.util.Collections;
import java.util.LinkedList;
public class Huffman {
static LinkedList<HuffmanNode> nodelist = new LinkedList<>();//使用双向链表存储节点序列
Huffman(LinkedList<HuffmanNode> nodelist){
Huffman.nodelist = nodelist;
}
public void huffmanCode() {
if(nodelist.size() == 1) return;
while(nodelist.size() > 1) {
Collections.sort(nodelist);//将结点序列从小到大排序
HuffmanNode temp = new HuffmanNode(nodelist.get(0),nodelist.get(1));//取最小的两个结点合并成一个结点
nodelist.remove();
nodelist.remove();
nodelist.add(temp);//子节点虽然不在列表中,但并未被回收,因为在父节点中有引用
}
display(nodelist.get(0), "");
}
public void display(HuffmanNode node, String huffmancode) {//从左到右打印哈夫曼树中的叶子节点
if(node.leftChild==null && node.rightChild==null) {//叶结点
System.out.println("元素 " + node.name + " 编码:" + huffmancode);
return;
}
else {
display(node.leftChild, huffmancode+"0");//展示左子树
display(node.rightChild, huffmancode+"1");//展示右子树
}
}
}
class HuffmanNode implements Comparable<HuffmanNode>{//哈夫曼节点
int occurrences;//字符出现的次数
String name;//字符名
HuffmanNode leftChild = null;//左孩子
HuffmanNode rightChild = null;//右孩子
HuffmanNode(){}//默认构造函数
HuffmanNode(int occurrences, String name){
this.occurrences = occurrences;
this.name = name;
}
HuffmanNode(HuffmanNode leftChild, HuffmanNode rightChild){
this.leftChild = leftChild;
this.rightChild = rightChild;
this.occurrences = leftChild.occurrences+rightChild.occurrences;
}
@Override
public int compareTo(HuffmanNode o) {//实现了Comparable接口,可以通过 Collections.sort(或 Arrays.sort)进行排序。
// TODO Auto-generated method stub
if(this.occurrences < o.occurrences)
return -1;
else if(this.occurrences == o.occurrences)
return 0;
else return 1;
};
//问题:有多种哈夫曼树时,只能展示一种
}
测试实例
LinkedList<HuffmanNode> nodelist = new LinkedList<>();
Scanner input = new Scanner(System.in);
System.out.print("请输入结点个数:");
int n = input.nextInt();
System.out.println("请输入元素名称和出现次数:");
for(int i = 0; i < n; i++) {
String name = input.next();
int occurrences = input.nextInt();
HuffmanNode temp = new HuffmanNode(occurrences, name);
nodelist.add(temp);
}
input.close();
Huffman test = new Huffman(nodelist);
test.huffmanCode();
结果: