第六周作业——编码实现哈夫曼树

来源:互联网 发布:pc录屏软件 编辑:程序博客网 时间:2024/06/10 13:10

package haff;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import java.util.LinkedList;


public class Haff {

public static void main(String[]arg)
{
List<TreeNode> set = makeNodeSet();  //生成节点的集合set,每个字母对应一个节点

   while((set.size())>1)  //循环过后,set里将只含有哈夫曼树的根节点,也就是生成哈夫曼树
   {
TreeNode minNode1 = deletemin(set); //拿出set里频率最小的两个节点minNode1和minNode2
TreeNode minNode2 = deletemin(set); //不再放回set中
insert(minNode1,minNode2,set);  //生成节点minNode1和minNode2的父节点,并放入set中
   }

   TreeNode haffRoot = set.get(0);  //拿到根节点
   
   //输出各个字符的编码,得到集合setCode,其元素是含字母及其编码的TreeNode对象
   List<TreeNode> setCode = SearchForCode.makeCode(haffRoot,"",""); 


   CodeSave(setCode);  //字母编码,保存在文本char&&code中
}

/************* 子函数 **************************************************************/
static List<TreeNode> makeNodeSet()
{
        List<TreeNode> set = new LinkedList<TreeNode>();

set.add(new TreeNode("\40",18.3));
set.add(new TreeNode("e",10.2));
set.add(new TreeNode("t",7.7));
set.add(new TreeNode("a",6.8));
set.add(new TreeNode("o",5.9));
set.add(new TreeNode("i",5.8));
set.add(new TreeNode("n",5.5));
set.add(new TreeNode("s",5.1));
set.add(new TreeNode("h",4.9));
// System.out.println("e"+"\40"+"e");

set.add(new TreeNode("r",4.8));
set.add(new TreeNode("d",3.5));
set.add(new TreeNode("l",3.4));
set.add(new TreeNode("c",2.6));
set.add(new TreeNode("u",2.4));
set.add(new TreeNode("m",2.1));
set.add(new TreeNode("w",1.9));
set.add(new TreeNode("f",1.8));
set.add(new TreeNode("g",1.7));

set.add(new TreeNode("y",1.6));
set.add(new TreeNode("p",1.6));
set.add(new TreeNode("b",1.3));
set.add(new TreeNode("v",0.9));
set.add(new TreeNode("k",0.6));
set.add(new TreeNode("j",0.2));
set.add(new TreeNode("x",0.2));
set.add(new TreeNode("q",0.1));
set.add(new TreeNode("z",0.1));

return set;
}

static TreeNode deletemin(List<TreeNode> setPara)
{
List<TreeNode> set = setPara;
TreeNode a = null;
TreeNode b = null;


//for(int i=0;i<(set.size());)
if(set.size()>1)
for(int j = 1;j<(set.size());j++)
{
a = set.get(0);
b = set.get(j);
if(a.f > b.f){ a = b;}
}
if(set.size()==1)
{
a = set.get(0);
set.remove(a);
return a;
}
set.remove(a);
//System.out.println("是否空位:"+set.get(0).s);
return a;
}

static void insert(TreeNode minNodePara1,TreeNode minNodePara2,List<TreeNode> setPara)
{
TreeNode minNode1 = minNodePara1;
TreeNode minNode2 = minNodePara2;
List<TreeNode> set = setPara;
double f = minNode1.f+minNode2.f;
TreeNode FatherNode = new TreeNode(null,f);
FatherNode.left = minNode1;
FatherNode.right = minNode2;
set.add(FatherNode);
}

static void CodeSave(List<TreeNode> setCode)
{
File file = new File("src\\char&&code.txt");;
BufferedWriter out  = null;
try{
out  = new BufferedWriter(new FileWriter(file));
}catch(IOException e){e.printStackTrace();}
try {
for(int i = 0;i<setCode.size();i++)
{
out.write(setCode.get(i).s);
out.write(" "); //一个空格
out.write(setCode.get(i).p);
out.newLine();
}
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


package haff;


import java.util.List;
import java.util.LinkedList;


public class SearchForCode {

static List<TreeNode> set = new LinkedList<TreeNode>();

static List<TreeNode> makeCode(TreeNode t,String preP,String num)
{
if(t!=null)
{
if(t.s!=null)
{
t.p = t.p+preP+num;
System.out.println(t.s+" 的编码是 "+t.p);
set.add(t);
}
if(t.s==null)
{
t.p=t.p+preP+num;
makeCode(t.left,t.p,"0");
makeCode(t.right,t.p,"1");
}

}
return set;
}
}


package haff;


public class TreeNode {

String s = null;  //字母
String p = "";  //编码
double f = 0;     //频率

TreeNode left = null;
TreeNode right = null;

TreeNode(String s,double f){ this.s = s;this.f = f;}
}


0 0
原创粉丝点击