该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
package huffman;
public class HuffmanTree {
private String charset;
private TriElement[]huftree;
public HuffmanTree(int[]weights){
this.charset="";
for(int i=0;i
this.charset+=(char)('A'+i);
int n=weights.length;
this.huftree=new TriElement[2*n-1];
for(int i=0;i
this.huftree[i]=new TriElement(weights[i]);
for (int i=n;i<2*n-1;i++)
{ int min1=Integer.MAX_VALUE,min2=min1;
int x1=-1,x2=-1;
for(int j=0;j
if(this.huftree[j].parent==-1)
if(this.huftree[j].data
{min2=min1;
x2=x1;
min1=this.huftree[j].data;
x1=j;
}
else if(this.huftree[j].data
{ min2=huftree[j].data;
x2=j;
}
this.huftree[x1].parent=i;
this.huftree[x2].parent=i;
this.huftree[i]=new TriElement(min1+min2,-1,x1,x2);
}
}
public String getCode(int i)
{
int n=8;
char hufcode[]=new char[n];
int child=i,parent=this.huftree[child].parent;
for (i=n-1;parent!=-1;i--){
hufcode[i]=(huftree[parent].left==child)?'0':'1';
child =parent;
parent =huftree[child].parent;
}
return new String(hufcode,i+1,n-1-i);
}
public String toString()
{
String str="Huffman树的结点数组:";
for(int i=0;i
str+=this.huftree[i].toString()+",";
str+="\nHuffman 编码:";
for(int i=0;i
str+=this.charset.charAt(i)+":"+getCode(i)+",";
return str;
}
public String encode(String text)
{
String compressed="";
for(int i=0;i
compressed+=getCode(text.charAt(i)-'A');
return compressed;
}
public String decode(String compressed){
String text ="";
int node =this.huftree.length-1;
for(int i=0;i
if(compressed.charAt(i)=='0')
node=huftree[node].left;
else node=huftree[node].right;
if(huftree[node].isLeaf()){
text+=this.charset.charAt(node);
node=this.huftree.length-1;
}
}
return text;
}
public static void main(String[] args) {
String text="AAAAABBBCDDBBAAA";
int[]weight={7,5,1,2};
HuffmanTree huffman=new HuffmanTree(weight);
System.out.println(huffman.toString());
String compressed=huffman.encode(text);
System.out.println(compressed);
System.out.println(huffman.decode(compressed));
}
}