哈夫曼树及其Java简单实现



import java.util.Arrays;
import java.util.Scanner;
/**
 * *
 * @author 杨炬龙
 *	一下午的成果,写的头大
  *   希望对你们有帮助
 */


public class Connection1{
	public static void main(String[] args) throws Exception{
	int []a= {8,5,10,8,6,9,11};//频率
	String []b= {"A","B","C","D","E","F","G"};//字符
	Queue ok=new Queue();
	for (int i = 0; i < a.length; i++) {
		ok.in(new Node(a[i],b[i]));
	}
	System.out.println(Arrays.toString(a));
	Node oka=CreateThree(ok);//创建哈夫曼树
	display(oka);//来绑码
	Test(oka);//显示节点
	System.out.println( GOGOGO(oka,"111"));
	System.out.println(zhaoEn(oka,"C"));
	}
	public static void display(Node root) {//通过层序遍历来绑编码
		if(root==null) return;
		Node temp=root;
		HHHa ok=new HHHa();
		ok.in(temp);
		while(!ok.ISnull()) {
			temp=ok.out();
			if(temp==null) return;
			if(temp.left!=null)
				temp.left.encoding=temp.encoding+"0";
				ok.in(temp.left);
			if(temp.right!=null)
				temp.right.encoding=temp.encoding+"1";
				ok.in(temp.right);			
		}
	}
	public static void Test(Node root) {
		if(root==null) return;
		System.out.println(root.val+"频率  "+root.data+" 编码 "+root.encoding);
		Test(root.left);
		Test(root.right);
	}
	public static Node CreateThree(Queue qua) {
		if(qua==null) return null;
		if(qua.size()==2) return qua.out();//一个就跳出去
		Stak stak=new Stak(qua.size());
		Queue qq=new Queue();
		while(!qua.ISnull()) {
			stak.push( qua.out());//利用栈的特性 来把优先级的值存里面
		}
		while(!stak.isNull()) {
			Node one=stak.pop();//每一次出的都是最小值
			if(stak.getsize()>0) {//还有的话 给他们生成一个父级
				Node one2=stak.pop();
				Node parent=new Node(one.data+one2.data,one.val+one2.val);
			if(one.data>one2.data) {
				parent.left=one2;
				parent.right=one;				
			}else {
				parent.left=one;
				parent.right=one2;
			}				
				qq.in(parent);
			}else {
				qq.in(one);
			}
		}
		return CreateThree(qq);//一直调用直到只有一个节点
		
	}
	public static String GOGOGO(Node node,String a) {//通过二进制码找values值
		if(node==null) return "";
		if(a.length()==0) return node.val;
		int b=Integer.parseInt(a.charAt(0)+"");
			if(b==0) {
				return GOGOGO(node.left, a.length()==1 ? "":a.substring(1));//如果1的话不用拆分提取
			}else 			
			return	GOGOGO(node.right,a.length()==1 ? "":a.substring(1));				
	}
	public static String zhaoEn(Node node,String ok) {//把值通过二进表示
		if(node==null) return "";
		if(node.val.equals(ok))
			return node.encoding;
		else {			
		String en= zhaoEn(node.left, ok);
		String en2= zhaoEn(node.right, ok);
		return en.equals("") ? en2 :en;
		}
		
	}
}
class Stak{//栈
	Node[] aa;
	int top=-1;
	public Stak(int size) {
		aa=new Node[size];
	}
	public void push(Node a) {
		aa[++top]=a;
	}
	public Node pop() {
		return aa[top--];
	}
	public boolean isNull() {
		return top==-1;
	}
	public int getsize() {
		return top+1;
	}
}
class HHHa extends Queue{//不优先队列
	public void in(Node a) {
		 ak[i++]=a;
	}
}

class Queue {  //优先级队列
 Node [] ak=new Node[10];
 int i=1;
 public void in(Node a) {
	 if(i>1) {
		 for (int j = 1; j < i; j++) {
			if(ak[j].data<a.data) {
				for (int l = i-1; l >=j; l--) {
					ak[l+1]=ak[l];
				}
				ak[j]=a;
				i++;
				return;
			}
		}
		 ak[i++]=a;
	 }
	 else
	 ak[i++]=a;
 }
 public Node out() {
	 Node temp=ak[1];
	 for (int j = 1; j <i ; j++) {
		ak[j-1]=ak[j];
	}
	 i= i<2?1:i-1;
	 return temp;
 }
 public boolean ISnull() {
	 return i==1;
 }
 public int size() {
	 return i;
 }

}

class Node{
	public Node(int data,String val) {
		this.data=data;
		this.val=val;
	}
	public int data=0;//权重
	public String val="";//数据
	public String encoding="";//编码
	public Node left;
	public Node right;
}
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值