
哈夫曼
编码与解码(
文件编码与解码)
数据结构实验
实现哈夫曼树的编码与译码
主功能函数
//具体细节已经写在注释里面了
Java实现
package Haffman;
import java.io.*;
import java.util.*;
public class HuffMain {
public static void main(String[] args) {
String srcFile="D:\test\srcfile.txt";//要压缩的文件
String zipFile1="D:\test\b.txt";//压缩后的文件
zipFile(srcFile,zipFile1);//压缩函数
String dstFile="D:\test\dstfile.txt";//将压缩后的文件解压缩到新文件中
// String srcFile="D:\test\beautiful.jpg";
//
// String zipFile1="D:\test\d.zip";
// zipFile(srcFile,zipFile1);
// String dstFile="D:\test\x.jpg";
unZipFile(zipFile1,dstFile);
}
public static byte[] huffmanzip(byte[] bytes) {
List nodes = getNodes(bytes);//计算权重,创建每个结点,放在list集合里面.
HTreeNode
哈夫曼建树
public class HuffmanTree {
public static HTreeNode creatHuffTree(List nodes) {
while (nodes.size() > 1) {
Collections.sort(nodes);
HTreeNode left = nodes.get(nodes.size() - 1);
HTreeNode right = nodes.get(nodes.size() - 2);
HTreeNode parent = new HTreeNode<>(null, left.getWeight() + right.getWeight());
parent.setLeft(left);
parent.setRight(right);
nodes.remove(left);
nodes.remove(right);
nodes.add(parent);
}
return nodes.get(0);
}
// Map map = new linkedHashMap<>();
//
// public Map getHfmCode(HTreeNode root) {
//
// return (Map) map;
// }
}
结点类
public class HTreeNode implements Comparable> {
private T data;
private int weight;
private HTreeNode left;
private HTreeNode right;
public HTreeNode(T data, int weight) {
this.data = data;
this.weight = weight;
}
public HTreeNode() {
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public HTreeNode getLeft() {
return left;
}
public void setLeft(HTreeNode left) {
this.left = left;
}
public HTreeNode getRight() {
return right;
}
public void setRight(HTreeNode right) {
this.right = right;
}
@Override
public int compareTo(HTreeNode o) {
// 从大到小排
if (o.getWeight() > this.getWeight()) {
return 1;
} else if (o.getWeight() < this.getWeight()) {
return -1;
} else {
return 0;
}
}
@Override
public String toString() {
return "HTreeNode{" +
"data=" + data +
", weight=" + weight +
", left=" + left +
", right=" + right +
'}';
}
public static void preOrder(HTreeNode node) {
if (node != null) {
System.out.println(node);
preOrder(node.left);
preOrder(node.right);
}
}
public static Integer cacluateWeight(HTreeNode node, int deep) {
if (node != null) {
if (node.left == null && node.right == null) {
return node.weight * deep;
}
return cacluateWeight(node.left, deep + 1) + cacluateWeight(node.right, deep + 1);
}
return 0;
}
}
评论列表(0条)