要求:
对输入的一串电文字符实现哈夫曼编码,并对给定的代码串进行译码,输出电文字符串。具体包括哈夫曼树的建立、哈夫曼编码的生成和编码文件的译码。
假设举如下例子
存储结构:
模型:
哈夫曼树节点类:
package keshe;
public class HuffNode {
Character ch;//字符
int val;//判断值,往左走即置为0,往右走即置为1
int freq;//权值
HuffNode left;
HuffNode right;
public HuffNode() {
}
public HuffNode(Character ch, int val, int freq, HuffNode left, HuffNode right) {
this.ch = ch;
this.val = val;
this.freq = freq;
this.left = left;
this.right = right;
}
}
方法:
package keshe;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
public class Huffman {
//根据字符串建立二叉树,s:要编码的源字符串
public HuffNode constructTree(String s) {
if (s == null || s.equals("")) {
//s=null,即未分配地址;s="",分配了地址空间,不过占0字节,二者不同
return null;
}
//计算每个字母的出现的次数,放到Map中
Map<Character, Integer> dataMap = new HashMap<Character, Integer>();//两种类型,Map集合里面有一堆元素,每个元素都包含一个键对象和一个值对象
//即相应字符串中的每一个字符+其对应的权值
for (int i = 0; i < s.length(); i++) {
Character c = s.charAt(i);//返回指定索引处的字符
if (dataMap.containsKey(c)) {
//判断是否包含指定的键名
int count = dataMap.get(c);//返回键名对应的值(即权值/次数)
dataMap.put(c, count + 1);//重写已出现过得元素(键值-权值对)
} else {
dataMap.