时隔两年总算把哈夫曼的编码搞清楚了,哈夫曼树也称为最优二叉树,他就是个二叉树,只不过是带权的且每个叶子结点上的权重与该结点到树根上之间的路径长度之积最小, 假如有n个权值{w1,w2,...,wn} ,n个叶子结点上的权为wi,结点到树根的路径为li则这个树的带权路径长度
WPL=w1l1+w2l2+..+wili
我用JAVA实现
根据一般性规律,当有n个叶子时总结点树数为2*n-1个,构造方法基本思想:1.刚开始构造N个有权值得只有根结点的二叉树+剩下的无权值得只有根结点的二叉树 2.选取两个根结点权值最小的两个作为左右子树放在那些剩下的非叶子的无权值得二叉树下,这时这棵新的二叉树的权值为其左右子树的权值之和3.重复2的操作最后就可以等到一颗拥有所以叶子的哈夫曼树。具体代码如下:
Huffman.java
import java.util.Arrays;
/**
* Created by Administrator on 2016/11/5.
*/
public class Huffman {
/**
* 数组统一从1开始
*
* @param w 权重的数组
* @param n 叶子的个数
* @return 哈夫曼二叉树
*/
public Node[] huffmanTree(int[] w, int n) {
if (n <= 1) {
return null;
}
int m = 2 * n - 1;
Node[] nodes = new Node[m + 1];//需要的所有结点 0号单元不用
for(int i=1;i<=m;i++){
nodes[i]=new Node();
}
for (int i = 1; i <= n; i++) {
nodes[i].weight =w[i];
nodes[i].index=i;
}
for(int i=n+1;i<=m;++i){
nodes[i].index=i;
}
/*****建立哈夫曼树*******/
f