这是我第一次使用stackoverflow提出问题,我希望你们可以帮助我:)
我正致力于实施霍夫曼代码。问题是当我尝试打印代码时,我得到了错误的结果。
这是输入文件和正确的结果:
Symbol A B C D _
frequency 0.35 0.1 0.2 0.2 0.15
Code 11 100 00 01 101
我得到的结果:
Symbol A B C D _
frequency 0.35 0.1 0.2 0.2 0.15
Code 00 011 10 11 010
这是类文件:
import java.util.*;
import java.io.*;
import java.util.PriorityQueue;
public class Node implements Comparable<Node> {
Node left;
Node right;
Node parent;
String text;
Float frequency;
public Node(String textIn, Float frequencies) {
text = textIn;
frequency = frequencies;
}
public Node(Float d) {
text = "";
frequency = d;
}
public int compareTo(Node n) {
if (frequency < n.frequency) {
return -1;
} else if (frequency > n.frequency) {
return 1;
}
return 0;
}
public static void buildPath(Node root,String code)
{
if (root!=null)
{
if (root.left!=null)
buildPath(root.left, code+"0");
if (root.right!=null)
buildPath(root.right,code+"1");
if (root.left==null && root.right==null)
System.out.println(root.text+": "+code);
}
}
public static Node makeHuffmanTree(Float[] frequencies, String text[]) {
PriorityQueue<Node> queue = new PriorityQueue<Node>();
for (int i = 0; i < text.length; i++) {
Node n = new Node(text[i], frequencies[i]);
queue.add(n);
}
Node root = null;
while (queue.size() > 1) {
Node least1 = queue.poll();
Node least2 = queue.poll();
Node combined = new Node(least1.frequency + least2.frequency);
combined.right = least1;
combined.left = least2;
least1.parent = combined;
least2.parent = combined;
queue.add(combined);
// Keep track until we actually find the root
root = combined;
}
return root;
}
我认为我的打印方法有问题吗?
和继承人我的主要
public static void main(String[] args)
String[] Symbol = {"A","B","C","D","_"};
Float[] frequency = (0.35,0.1,0.2,0.2,0.15};
Node root = Node.makeHuffmanTree(frequency, Symbol);
Node.buildPath(root, "");
答案 0 :(得分:1)
在你的输出中,各个代码的长度看起来很好,所以我不太相信它现在是一个树遍历的问题。
差异很可能在于你如何构建树。当您从队列中弹出两个元素并将这两个元素作为子树创建时,选择哪个子树是“左”子树会影响生成的代码。
看看你的while循环,我看到了
while (queue.size() > 1) {
Node least1 = queue.poll();
Node least2 = queue.poll();
Node combined = new Node(least1.frequency + least2.frequency);
combined.right = least1;
combined.left = least2;
least1.parent = combined;
least2.parent = combined;
queue.add(combined);
// Keep track until we actually find the root
root = combined;
}
我没有完全完成这个例子,但是在完成了你的例子之后,我认为只需改为combined.left = least1
和combined.right = least2
而不是相反给出你期望的代码。