提问者:小点点

哈夫曼树算法理解困难


我在基于频率表的哈夫曼树上工作。频率表是通过计算给定字符串中字符的频率并将相应项(字符和频率)放置在链接列表中生成的。然后,我需要将项目按频率顺序放置在哈夫曼树中。我得到了它背后的逻辑是确保每个子树都有右节点和左节点,添加它们的频率,用它们添加的频率创建一个根节点,将下一个频率分别放在左树和右树中,并重复这个过程,直到没有更多的频率,子树与添加其频率的根连接;我遇到的问题是如何实现代码。

代码相当广泛,所以我宁愿避免发布所有代码,总体布局是我有一个HuffmanFrequencyTable类,它允许我构建表,一个HuffmanTreeNode类,它允许我们创建要放置在树中的节点,还有一个HuffmanTree类,它帮助我们创建实际的树。然后,一个encode类输入一个字符串,并使用它创建的HuffmanFrequencyTable从该字符串构建树。这是一个家庭作业问题,所以请不要提供解决方案,我只是希望得到一些帮助,找出它的代码中的逻辑。

现在,我正在创建一个已放置在树中的字符数组,找到不在数组中的表中剩余字符的最低频率,并尝试将它们放置在叶子中。当子树中的基本叶子已满时,我尝试添加这些值,创建一个节点,然后继续向上树。为此,我使用for循环。这看起来是正确的开始吗?


共2个答案

匿名用户

正如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;
    }

}

用于以后设置相应的代码。

匿名用户

是的。你在正确的轨道上。

在解码时,使用同一棵树,向左或向右遍历,直到到达叶子节点,这就是字符。