Java 哈夫曼树算法理解困难

Java 哈夫曼树算法理解困难,java,tree,huffman-code,Java,Tree,Huffman Code,我正在研究一个基于频率表的哈夫曼树。频率表是通过计算给定字符串中字符的频率并将相应项(字符和频率)放入LinkedList中生成的。然后,我需要按照项目的频率顺序将项目放置在Huffman树中。我明白了它背后的逻辑是确保每个子树都有右节点和左节点,添加它们的频率,用它们添加的频率创建一个根节点,将下一个频率分别放在左树和右树中,并重复此过程,直到没有更多的频率,子树与一个根连接,该根将其频率相加;我遇到的麻烦是弄清楚如何实现代码 代码相当广泛,因此我宁愿避免发布所有代码,总体布局是我有一个Huf

我正在研究一个基于频率表的哈夫曼树。频率表是通过计算给定字符串中字符的频率并将相应项(字符和频率)放入LinkedList中生成的。然后,我需要按照项目的频率顺序将项目放置在Huffman树中。我明白了它背后的逻辑是确保每个子树都有右节点和左节点,添加它们的频率,用它们添加的频率创建一个根节点,将下一个频率分别放在左树和右树中,并重复此过程,直到没有更多的频率,子树与一个根连接,该根将其频率相加;我遇到的麻烦是弄清楚如何实现代码

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


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

是的。你在正确的轨道上


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

是。你在正确的轨道上


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

正如Sajit所说,您走的路是正确的。也许您可以定义一个额外的类HuffManTuple

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

}

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

正如Sajit所说,您的方法是正确的。也许您可以定义一个额外的类HuffManTuple

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

}

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

基本上就是我们在骨架文件中必须做的事情。谢谢:)这正是我们在骨架文件中要做的。谢谢:)谢谢你让我知道我没有走错,只是不想继续走错路。退一步,深吸一口气,去掉了我代码中的垃圾,认为它是好的。谢谢:)谢谢你让我知道我没有走错,只是不想继续走错路。退一步,深吸一口气,去掉了我代码中的垃圾,认为它是好的。谢谢:)