java實現赫夫曼樹

    以下是我用java實現數據結構中的赫夫曼樹

package com.husiwang.HuffmanTree; 
 
 
/** 
 * Created by SiwangHu on 2015/2/3. 
 */ 
public class HuffmanTreeNode { 
    private String Data;        //數據緩存 
    private int Weight;        //權值 
    private int Parent;        //父結點 
    private int LeftChild;    //左結點 
    private int RightChild;   //右結點 
    private Object[] Code;     //編碼 
    private int Length;       //編碼長度 
 
    public HuffmanTreeNode() { 
        Data = null; 
        Weight=0; 
        Parent=-1; 
        LeftChild=-1; 
        RightChild=-1; 
    } 
 
    public HuffmanTreeNode(String data) { 
        Data = data; 
        Weight=0; 
        Parent=-1; 
        LeftChild=-1; 
        RightChild=-1; 
    } 
 
    public HuffmanTreeNode(String data, int weight) { 
        Data = data; 
        Weight = weight; 
        Parent=-1; 
        LeftChild=-1; 
        RightChild=-1; 
    } 
 
    public HuffmanTreeNode(int parent, int leftChild, int rightChild) { 
        Data=null; 
        Weight=0; 
        Parent = parent; 
        LeftChild = leftChild; 
        RightChild = rightChild; 
    } 
 
    public HuffmanTreeNode(String data, int weight, int parent, int leftChild, int rightChild) { 
        Data = data; 
        Weight = weight; 
        Parent = parent; 
        LeftChild = leftChild; 
        RightChild = rightChild; 
    } 
 
    public String getData() { 
        return Data; 
    } 
 
    public int getWeight() { 
        return Weight; 
    } 
 
    public int getParent(){ 
        return Parent; 
    } 
 
    public int getLeftChild() { 
        return LeftChild; 
    } 
 
    public int getRightChild() { 
        return RightChild; 
    } 
 
    public String getCode() { 
        String temp=""; 
        for(int i=0;i<Code.length;i++){ 
            temp+=Code[i]; 
        } 
        return temp; 
    } 
 
    public int getLength() { 
        return Code.length; 
    } 
 
    public void setData(String data) { 
        Data = data; 
    } 
 
    public void setWeight(int weight) { 
        Weight = weight; 
    } 
 
    public void setParent(int parent) { 
        Parent = parent; 
    } 
 
    public void setLeftChild(int leftChild) { 
        LeftChild = leftChild; 
    } 
 
    public void setRightChild(int rightChild) { 
        RightChild = rightChild; 
    } 
 
    public void setCode(Object[] code) { 
        for (int i = 0; i <code.length ; i++) { 
            Code[i]=code[i]; 
        } 
    } 
 
    public void setCode(int i,Object data){ 
        Code[i]=data; 
    } 
 
    public void setLength(int length) { 
        Length=length; 
        Code=new Object[length]; 
    } 
 
    @Override 
    public String toString() { 
        String temp=""; 
        for(int i=0;i<Code.length;i++){ 
            temp+=Code[i]; 
        } 
        return "HuffmanTreeNode{" + 
                "Weight=" + Weight + 
                ", Data='" + Data + '\'' + 
                ", Parent=" + Parent + 
                ", LeftChild=" + LeftChild + 
                ", RightChild=" + RightChild + 
                ", Code=" + temp + 
                ", Length=" + Length + 
                '}'; 
    } 
}




package com.husiwang.HuffmanTree; 
 
 
/** 
 * Created by SiwangHu on 2015/2/3. 
 */ 
public class HuffmanTree { 
    private HuffmanTreeNode Node[];    //結點 
    private int NodeNum;              //結點數目 
    private Object[] Temp;            //臨時編碼量 
 
    public HuffmanTree(int nodeNum){ 
        Node=new HuffmanTreeNode[2*nodeNum-1]; 
        for(int i=0;i<2*nodeNum-1;i++){ 
            Node[i]=new HuffmanTreeNode(); 
        } 
        Temp=new Object[300]; 
        NodeNum=nodeNum; 
    } 
 
    public int getNodeNum() { 
        return NodeNum; 
    } 
 
    public void setNodeNum(int nodeNum) { 
        NodeNum = nodeNum; 
    } 
 
    public void setTemp(int temp) { 
        Temp=new Object[temp]; 
    } 
 
    public int getTemp() { 
        return Temp.length; 
    } 
 
    public void CreateHuffmanTree(String[] data,int[] weight){ 
        if(NodeNum!=weight.length||NodeNum!=data.length) 
            return; 
        else{ 
            for(int i=0;i<data.length;i++){ 
                Node[i].setData(data[i]); 
                Node[i].setWeight(weight[i]); 
            } 
            for(int i=0;i<NodeNum-1;i++){ 
                int Max1=Integer.MAX_VALUE; 
                int Max2=Integer.MAX_VALUE; 
                int Temp1=0,Temp2=0; 
                for(int j=0;j<NodeNum+i;j++){ 
                    if(Node[j].getWeight()<Max1&&(Node[j].getParent()==-1)){ 
                        Max2 = Max1; 
                        Temp2 = Temp1; 
                        Temp1 = j; 
                        Max1=Node[j].getWeight(); 
                    } 
                    else if(Node[j].getWeight()<Max2&&(Node[j].getParent()==-1)){ 
                        Max2 = Node[j].getWeight(); 
                        Temp2 = j; 
                    } 
                } 
                Node[Temp1].setParent(NodeNum+i); 
                Node[Temp2].setParent(NodeNum+i); 
                Node[NodeNum+i].setWeight(Node[Temp1].getWeight()+Node[Temp2].getWeight()); 
                Node[NodeNum+i].setLeftChild(Temp1); 
                Node[NodeNum+i].setRightChild(Temp2); 
            } 
        } 
    } 
 
    public void Coding(){ 
        for(int i=0;i<NodeNum;i++){ 
            int count=0,node,parent; 
            for(node=i,parent=Node[i].getParent();parent!=-1;node=parent,parent=Node[node].getParent()){ 
                if(Node[parent].getLeftChild()==node){ 
                    Temp[count]='0'; 
                    count++; 
                } 
                else{ 
                    Temp[count]='1'; 
                    count++; 
                } 
            } 
            Node[i].setLength(count); 
            for (int j = count-1,k=0; j>-1 ; j--,k++) { 
                Node[i].setCode(k,Temp[j]); 
            } 
        } 
    } 
 
    public String DeCoding(char[] data){ 
        String text=""; 
        int root=getRoot(); 
        for (int i = 0; i <data.length ; i++) { 
            if(data[i]=='0') 
                root=Node[root].getLeftChild(); 
            if(data[i]=='1') 
                root=Node[root].getRightChild(); 
            if(Node[root].getLeftChild()==-1&&Node[root].getRightChild()==-1){ 
                text+=Node[root].getData(); 
                root=getRoot(); 
            } 
        } 
        return text; 
    } 
 
    public int getRoot() { 
        int node, parent; 
        for (node = 0, parent = Node[node].getParent(); parent != -1; node = parent, parent = Node[node].getParent()) { 
        } 
        return node; 
    } 
 
    public HuffmanTreeNode Get(int Index){ 
        if(Index<NodeNum){ 
            return Node[Index]; 
        } 
        else{ 
            throw new RuntimeException("下標過界"); 
        } 
    } 
 
    @Override 
    public String toString() { 
        String temp=""; 
        for (int i = 0; i <NodeNum ; i++) { 
            temp+=Node[i]; 
        } 
        return "HuffmanTree{" + 
                "Node=" + temp + 
                ", NodeNum=" + NodeNum + 
                '}'; 
    } 
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章