编写一个程序,利用哈夫曼树求取哈夫曼编码。构造一棵哈夫曼树并进行哈夫曼编码。实验步骤: ①、在编辑环境中新建程序,输入程序内

废话不多说,直接上代码,一共四个文件

第一个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;
	}  
  
}  
把这四个文件放在一个包里,就可以运行了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值