如题
哈夫曼基本思想百度说的更好,在此不做赘余,直接上实现思路与具体代码。
1.先实现哈夫曼树的基础 节点 以及 编码 (假设树已经建好)
public class node {
String rode ="";
node left = null;
node right = null;
int value=1;
char c;
node (){}
node (char c){
this.c=c;
}
public void add() {
this.value++;
}
public void addleft(node a) {
this.left=a;
}
public void addright(node a) {
this.right=a;
}
public void printcode() {
if(this.left==null&&this.right==null) {
System.out.println(this.c+" "+this.rode);
return ;
}
else if(this.left!=null&&this.right==null) {
this.left.rode=this.rode + "0";
}
else if(this.left==null&&this.right!=null) {
this.right.rode=this.rode+ "1";
}
else {
this.left.rode=this.rode + "0";
this.right.rode=this.rode+ "1";
}
this.left.printcode();
this.right.printcode();
}
}
这一步实现了哈夫曼树的节点数据结构,以及给该节点添加左、右子节点的方法。
编码方法,自然就是通过简单的递归,给本节点的左右子节点编码根据左右增加 0 1,如父节点编码为00,则该节点的左子节点编码为000,右子节点为001。
判断某节点是储存元素的方法为,该节点没有子节点,则为储存元素的节点。
2.构建哈夫曼树中包含元素的节点
首先,我们读到一字符串,应该先得到该字符串的所有元素出现的次数。(另一种给出数据的方式为直接给出元素和该元素出现次数或权值,大同小异)。我采用 hashmap,遍历字符串,每一个字符在hashmap中查找,如果没有则创建新的hashmap表key值,如果有,则在hashmap 该元素的 value +1. hashmap key值为元素种类,value为该元素出现的次数。
最终遍历一遍hashmap,按照 node 的数据结构构建 node,返回一个 list<node>,这个list就是我们用于反复拿出两个最小的权值节点进行构建哈夫曼树的各个节点的表。</