java兑现哈夫曼树模板

java实现哈夫曼树模板
package Template;


public class HuffmanTree {
	class HuffmanNode {
		int w;// 权值
		int lChild, rChild, parent;// 左右孩子及父节点

		public HuffmanNode(int w) {
			this.w = w;
			lChild = rChild = parent = -1;
		}
	}

	int n;
	HuffmanNode[] huffman ;

	//从huffman中找出两个最小的权值,并保存小标到m1和m2
	int m1,m2;
	public void selectMin(){
		//找出最小的
		int minw = Integer.MAX_VALUE;
		for (int i = 0; i < n; i++) {
			if (huffman[i].w < minw && huffman[i].parent == -1) {
				minw = huffman[i].w;
				m1 = i;
			}
		}
		//找次小的
		minw = Integer.MAX_VALUE;
		for (int i = 0; i < n; i++) {
			if (huffman[i].w < minw && huffman[i].parent == -1 && i != m1) {
				minw = huffman[i].w;
				m2 = i;
			}
		}
	}
	
	//建立赫夫曼树
	public void buildHuffmanTree(int[] w) {
		n = w.length;
		huffman = new HuffmanNode[2*n-1];
		
		for (int i = 0; i < n; i++)
			huffman[i] = new HuffmanNode(w[i]);
		for (int i = n; i < 2 * n - 1; i++)
			huffman[i] = new HuffmanNode(-1);
		
		while(n < huffman.length){
			//从huffman中选择两个权值最小的节点构建新节点
			selectMin();
			//构造新节点
			huffman[n].w =  huffman[m1].w+huffman[m2].w;
			huffman[n].lChild = m1;
			huffman[n].rChild = m2;
			//修改m1和m2的父节点指针
			huffman[m1].parent = n;
			huffman[m2].parent = n++;
			
		}

	}
	//求带权路径长度
	public int WPL(int[]w){
		int sum = 0;
		for(int i = 0;i<w.length;i++){
			int p = huffman[i].parent;
			int ans = 0;
			while(p != -1){
				ans ++;
				p = huffman[p].parent;
			}
			sum  +=ans*w[i]; 
		}
		return sum;
	}
	//测试
	public void test(){
		int []w = {7,5,2,4};
		buildHuffmanTree(w);
		int r = WPL(w);
		System.out.println(r);
	}

	public static void main(String[] args) {
		new HuffmanTree().test();
	}

}