1 算法实现
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.*;
//哈夫曼树类
class HaffmanTree {
public static final int MAXVALUE = 1000;// 最大权值
public int nodeNum; // 叶子结点个数
public HaffmanTree(int n) {
this.nodeNum = n;
}
/**
* 构造哈夫曼树算法
*
* @param weight 权值
* @param nodes 叶子节点
*/
public void haffman(char[] names, int[] weight, HaffNode[] nodes) {
int n = this.nodeNum;
// m1,m2,表示最小的两个权值,x1,x2,表示最小两个权值对应的编号,m1表示最小,m2表示次小
int m1, m2, x1, x2;
// 初始化所有的结点,对应有n个叶子结点的哈夫曼树,有2n-1个结点
for (int i = 0; i < 2 * n - 1; i++) {
HaffNode temp = new HaffNode();
// 初始化n个叶子结点,就是输入的节点。0、1、2、3是叶子节点也是输入的节点
if (i < n) {
temp.name = names[i];
temp.weight = weight[i];
} else {
temp.name = ' ';
temp.weight = 0;
}
temp.parent = 0;
temp.flag = 0;
temp.leftChild = -1;
temp.rightChild = -1;
nodes[i] = temp;
}
// 初始化n-1个非叶子结点,n-1表示要循环n-1次求的n-1个数
for (int i = 0; i < n - 1; i++) {
m1 = m2 = MAXVALUE;
x1 = x2 = 0;
// 求得这n-1个数时,每次都是从0到n+i-1,并且flag=0的,flag=1表示已经加入到二叉树。
// 以下2步是找出权值最小的2个
for (int j = 0; j < n + i; j++) {
if (nodes[j].weight < m1 && nodes[j].flag == 0) {
// m1,x1初始值为第一个元素,后面如果比m1要小,则m1指向更小的,原来m1指向的现在由m2指向,
// 如果后面比m1大比m2小,则m2指向这个比m1大比m2小的,
// 也就是说m1指向最小的,m2指向第2小的。
m2 = m1;
x2 = x1;
m1 = nodes[j].weight;