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;
}
哈夫曼树及其Java简单实现
最新推荐文章于 2024-06-19 19:28:38 发布