我在基于频率表的哈夫曼树上工作。频率表是通过计算给定字符串中字符的频率并将相应项(字符和频率)放置在链接列表中生成的。然后,我需要将项目按频率顺序放置在哈夫曼树中。我得到了它背后的逻辑是确保每个子树都有右节点和左节点,添加它们的频率,用它们添加的频率创建一个根节点,将下一个频率分别放在左树和右树中,并重复这个过程,直到没有更多的频率,子树与添加其频率的根连接;我遇到的问题是如何实现代码。
代码相当广泛,所以我宁愿避免发布所有代码,总体布局是我有一个HuffmanFrequencyTable类,它允许我构建表,一个HuffmanTreeNode类,它允许我们创建要放置在树中的节点,还有一个HuffmanTree类,它帮助我们创建实际的树。然后,一个encode类输入一个字符串,并使用它创建的HuffmanFrequencyTable从该字符串构建树。这是一个家庭作业问题,所以请不要提供解决方案,我只是希望得到一些帮助,找出它的代码中的逻辑。
现在,我正在创建一个已放置在树中的字符数组,找到不在数组中的表中剩余字符的最低频率,并尝试将它们放置在叶子中。当子树中的基本叶子已满时,我尝试添加这些值,创建一个节点,然后继续向上树。为此,我使用for循环。这看起来是正确的开始吗?
正如Sajit所说,您走在正确的道路上。也许您可以使用以下内容定义一个额外的类HuffmannTuple
public 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;
}
}
用于以后设置相应的代码。
是的。你在正确的轨道上。
在解码时,使用同一棵树,向左或向右遍历,直到到达叶子节点,这就是字符。