哈夫曼树的构造和编码
来源:互联网 发布:淘宝卖家7天不发货 编辑:程序博客网 时间:2024/05/18 10:08
看了半天,写出了属于自己的代码。不正之处请指出
public class Haffman {
static class MyNode{
String code="";
int weight;
Character character;
MyNode left;
MyNode right;
public MyNode(Character character,int weight){
this.weight=weight;
this.character=character;
}
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
while(scanner.hasNext()){
String string=scanner.next();
MyNode root=create(string);
visit(root);
getHalmanCode(root);
}
}
public static MyNode create(String string){
char[]characters=string.toCharArray();
HashMap<Character,Integer>hashMap=new HashMap<Character, Integer>();
for (int i = 0; i < characters.length; i++) {
if (hashMap.containsKey(characters[i])) {
hashMap.put(characters[i],hashMap.get(characters[i])+1);
}else {
hashMap.put(characters[i], 1);
}
}
ArrayList<MyNode>nodes=new ArrayList<Haffman.MyNode>();
for (char key:hashMap.keySet()) {
nodes.add(new MyNode(key,hashMap.get(key)));
}
while(true){
if (nodes.size()<=1) {
break;
}
Collections.sort(nodes, new Comparator<MyNode>() {
@Override
public int compare(MyNode o1, MyNode o2) {
// TODO Auto-generated method stub
if (o1.weight==o2.weight) {
}
return o1.weight-o2.weight;
}
});
MyNode minNode=nodes.get(0);
MyNode sNode=nodes.get(1);
nodes.remove(minNode);
nodes.remove(sNode);
MyNode newNode=new MyNode(null, minNode.weight+sNode.weight);
newNode.left=minNode;
newNode.right=sNode;
nodes.add(newNode);
}
return nodes.get(0);
}
public static void visit(MyNode root){
if (root!=null) {
Queue<MyNode>myNodes=new LinkedList<Haffman.MyNode>();
myNodes.offer(root);
while(!myNodes.isEmpty()){
MyNode currentNode=myNodes.poll();
System.out.print(currentNode.weight+" ");
if (currentNode.left!=null) {
myNodes.offer(currentNode.left);
}
if (currentNode.right!=null) {
myNodes.offer(currentNode.right);
}
}
}
System.out.println();
}
public static void getHalmanCode(MyNode root)
{
if (root==null) {
return ;
}
Queue<MyNode>queue=new LinkedList<Haffman.MyNode>();
queue.offer(root);
//层次遍历进行编码的过程
while(!queue.isEmpty()){
MyNode currentNode=queue.poll();
if (currentNode.left!=null) {
if (currentNode.left.character==null) {
currentNode.left.code=currentNode.code+"0";
queue.offer(currentNode.left);
}else {
//说明是编码的字符,也即是叶子节点
System.out.println(currentNode.left.character+":"+currentNode.code+"0");
}
}
if (currentNode.right!=null) {
if (currentNode.right.character==null) {
currentNode.right.code=currentNode.code+"1";
queue.offer(currentNode.right);
}else {
System.out.println(currentNode.right.character+":"+currentNode.code+"1");
}
}
}
}
}
- 哈夫曼树的构造和编码
- 哈夫曼树构造和编码方式
- 哈夫曼树的建立和哈夫曼编码的构造
- 哈夫曼树的构造,编码,译码
- 哈夫曼树的构造以及编码
- 哈夫曼树的构造算法,哈夫曼编码算法
- 哈夫曼树,及哈夫曼编码的构造
- 哈夫曼树的构造以及编码实现
- 哈夫曼树的构造与哈夫曼编码
- 构造哈夫曼树 求哈弗曼编码
- 哈夫曼树构造及编码
- 哈夫曼树构造与编码
- java huffman树的构造和huffman编码
- 哈夫曼树和哈夫曼编码基本概念及构造(上篇)
- 哈弗曼树的构造、什么是哈弗曼编码和怎样构造一颗编码代价最小又无二义的二叉树--用哈弗曼树
- C/C++ 哈夫曼树的构造、编码以及译码
- 哈夫曼树构造 哈夫曼编码得到
- 哈夫曼树构造及编码算法应用之26个字母的哈夫曼编码
- 小火车(链表)
- 系统调用和库函数的区别
- 高德地图定位及导航开发流程
- HDU-1217-Arbitrage
- Java中的内存处理机制和final、static、final static总结
- 哈夫曼树的构造和编码
- Java中ArrayList集合
- 矩乘dp 总结
- Java学习笔记(七)——继承
- nodejs 实践:express 最佳实践(二) 中间件
- Makefile中的-Wall -O2 -Os -g等选项介绍
- Kafka (一) 概述
- 优先队列
- JavaScript常用的数组API和对象API