我正在根据频率表开发一个霍夫曼树。频率表是通过计算给定字符串中字符的频率并将相应项(字符和频率)放在LinkedList中而生成的。然后,我需要按照频率的顺序将项目放在霍夫曼树中。我知道它背后的逻辑是确保每个子树都有左右节点,添加它们的频率,用它们增加的频率创建一个根节点,将下一个频率分别放在左边和右边的树中,然后重复这个过程直到没有更多的频率,并且子树与添加其频率的根连接;我遇到的麻烦是弄清楚如何实现代码。
代码相当广泛,所以我宁愿避免发布所有内容,一般布局是我有一个允许我构建表的HuffmanFrequencyTable类,一个允许我们创建节点放在树中的HuffmanTreeNode类和一个帮助我们创建实际树的HuffmanTree类。然后,编码类输入一个字符串,并使用它创建的HuffmanFrequencyTable从字符串构建树。这是一个家庭作业问题所以请不要提供解决方案,我只是希望能帮助我们弄清楚代码中的逻辑。
现在,我正在创建一个已放置在树中的字符数组,找到表中剩余字符中不在数组中的最低频率,并尝试将它们放在树叶中。当基本叶子在子树中已满时,我试图添加这些值,创建一个节点,然后继续向上运行树。我正在使用for循环。这看起来是正确的开始吗?
答案 0 :(得分:2)
正如Sajit所说,你是在正确的道路上。也许你用类似
之类的东西来定义一个额外的类HuffmannTuplepublic class HuffmannTuple{
public char character;
public double frequency;
public HuffmannTuple(char char, double freq){
character = char;
frequency = freq;
}
}
并创建一个排序列表,用于平均字长等值的泡沫计算。甚至
public class HuffmannTriple{
public char character;
public double frequency;
public String code;
public HuffmannTuple(char char, double freq){
character = char;
frequency = freq;
}
public void setCode(String c){
code = c;
}
}
稍后设置相应的代码。
答案 1 :(得分:1)
是。你走在正确的轨道上。
对于解码,您使用相同的树并向左或向右移动,直到到达叶节点,这就是角色。