当前位置:编程学习 > JAVA >>

(哈)赫夫曼树(Java版)

[java] 
package D0727; 
 
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(); 
    } 
 

作者:lhfight
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,