废话不多说,直接上代码,一共四个文件
第一个TriElement
public class TriElement {
int data; //根节点数据
int parent,left,right; //右子树
public TriElement(int data,int parent,int left,int right){
this.data = data;
this.parent = parent;
this.left = left;
this.right = right;
}
public TriElement(int data){this(data,-1,-1,-1);}
public TriElement(){this(0);}
public String toString(){
return"("+this.data+","+this.parent+","+this.left+","+this.right+")";
}
}
第二个文件HuffmanTree
public class HuffmanTree {
private int leafNum;
private TriElement[] huftree;
public HuffmanTree(int[] weight){
int n=weight.length;
this.leafNum=n;
this.huftree=new TriElement[2*n-1];
for(int i=0;i<n;i++)
this.huftree[i]=new TriElement(weight[i]);
for(int i=0;i<n-1;i++){
int min1=Integer.MAX_VALUE,min2=min1;
int x1=-1,x2=-1;
for(int j=0;j<n+i;j++)
if(huftree[i].data<min1&&huftree[j].parent==-1){
min2=min1;
x2=x1;
min1=huftree[j].data;
x1=j;
}
else if(huftree[j].data<min2&&huftree[j].parent==-1){
min2=huftree[j].data;
x2=j;
}
huftree[x1].parent=n+i;
huftree[x2].parent=n+i;
this.huftree[n+i]=new TriElement(huftree[x1].data+huftree[x2].data,-1,x1,x2);
}
}
public String toString(){
String str="Huffman树的结点数组:\n";
for(int i=0;i<this.huftree.length&&huftree[i]!=null;i++)
str+="第"+i+"行"+this.huftree[i].toString()+"\n";
return str;
}
public String[] huffmanCodes(){
String[] hufcodes=new String[this.leafNum];
for(int i=0;i<this.leafNum;i++){
hufcodes[i]="";
int child=i;
int parent=huftree[child].parent;
while(parent!=-1){
if(huftree[parent].left==child)
hufcodes[i]="0"+hufcodes[i];
else
hufcodes[i]="1"+hufcodes[i];
child=parent;
parent=huftree[child].parent;
}
}
return hufcodes;
}
}
第三个文件HuffmanTree_example
import java.util.Scanner;
import text5.SeqList;
public class HuffmanTree_example {
public static void main(String args[]){
SeqList<Integer> list=new SeqList<Integer>();
System.out.println("请依次输入权值并以0结束作为标识");
Scanner scan=new Scanner(System.in);
while(true){
int x=scan.nextInt();
if(x!=0)
list.append(x);
else
break;
}
int[] weight=new int[list.length()];
for(int i=0;i<list.length();i++){
weight[i]=list.get(i);
}
HuffmanTree htree=new HuffmanTree(weight);
System.out.print(htree.toString());
String[] code=htree.huffmanCodes();
System.out.print("Huffman编码: \n");
for(int i=0;i<code.length;i++)
System.out.println((char)('A'+i)+":"+code[i]+" ");
}
}
第四个文件SeqList
package text5;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class SeqList<T> implements List<T> {
private Object[] element;//声明一个对象数组
private int len;//声明一个顺序表长度,记载实际元素个数
public SeqList(int size)//构造函数,创建一个空表
{
this.element=new Object[size];
this.len=0;
}
public SeqList()//默认构造函数
{
this(64);
}
public boolean isEmpty() {
// TODO 自动生成的方法存根
return this.len==0;
}
public int length() {
// TODO 自动生成的方法存根
return len;
}
public T get(int i) {
// TODO 自动生成的方法存根
if(i>=0&&i<len)
return (T) this.element[i];
return null;
}
public void set1(int i, T x) {
// TODO 自动生成的方法存根
if(x==null)
return;
if(i>=0&&i<this.len)
this.element[i]=x;
else throw new IndexOutOfBoundsException(i+"");
}
public String toString()
{
String str="(";
if(len>0)
str+=element[0].toString();
for(int i=1;i<len;i++)
str+=","+element[i].toString();
return str+")";
}
public void insert(int i, T x) {
// TODO 自动生成的方法存根
if(x==null)
return;
if(len==element.length)
{
Object[] temp = element;//新建一个临时存储对象,把原数组存进去
element = new Object[element.length*2];//新建一个数组
for(i=0;i<temp.length;i++)
element[i]=temp[i];//把数组弄回去
}
if(i<0)
i=0;//容许错误机制
if(i>len)
i=len;
for(int j=len-1;j>=i;j--)
element[j+1]=element[j];
element[i]=x;
len++;
}
public void append(T x) {
// TODO 自动生成的方法存根
insert(len,x);
}
public T remove(int i) {
// TODO 自动生成的方法存根
if(i<0||i>len-1||len==0)
return null;
T old = (T)element[i];
for(int j=i;j<len-1;j++)
element[j]=element[j+1];
element[len-1]=null;
return old;
}
public void removeAll() {
// TODO 自动生成的方法存根
len=0;
}
public T search(T key) {
// TODO 自动生成的方法存根
for(int i=0;i<len;i++)
if(element[i].equals(key))
return (T)element[i];
return null;
}
@Override
public int size() {
// TODO 自动生成的方法存根
return 0;
}
@Override
public boolean contains(Object o) {
// TODO 自动生成的方法存根
return false;
}
@Override
public Iterator<T> iterator() {
// TODO 自动生成的方法存根
return null;
}
@Override
public Object[] toArray() {
// TODO 自动生成的方法存根
return null;
}
@Override
public <T> T[] toArray(T[] a) {
// TODO 自动生成的方法存根
return null;
}
@Override
public boolean add(T e) {
// TODO 自动生成的方法存根
return false;
}
@Override
public boolean remove(Object o) {
// TODO 自动生成的方法存根
return false;
}
@Override
public boolean containsAll(Collection<?> c) {
// TODO 自动生成的方法存根
return false;
}
@Override
public boolean addAll(Collection<? extends T> c) {
// TODO 自动生成的方法存根
return false;
}
@Override
public boolean addAll(int index, Collection<? extends T> c) {
// TODO 自动生成的方法存根
return false;
}
@Override
public boolean removeAll(Collection<?> c) {
// TODO 自动生成的方法存根
return false;
}
@Override
public boolean retainAll(Collection<?> c) {
// TODO 自动生成的方法存根
return false;
}
@Override
public void clear() {
// TODO 自动生成的方法存根
}
@Override
public T set(int index, T element) {
// TODO 自动生成的方法存根
return null;
}
@Override
public void add(int index, T element) {
// TODO 自动生成的方法存根
}
@Override
public int indexOf(Object o) {
// TODO 自动生成的方法存根
return 0;
}
@Override
public int lastIndexOf(Object o) {
// TODO 自动生成的方法存根
return 0;
}
@Override
public ListIterator<T> listIterator() {
// TODO 自动生成的方法存根
return null;
}
@Override
public ListIterator<T> listIterator(int index) {
// TODO 自动生成的方法存根
return null;
}
@Override
public List<T> subList(int fromIndex, int toIndex) {
// TODO 自动生成的方法存根
return null;
}
}
把这四个文件放在一个包里,就可以运行了