java - Java中从哈夫曼树方法获取代码

标签 java huffman-code

我编写的代码应该能够返回霍夫曼树中代码的 ArrayList。 Code 类有一个字符及其对应的编码。在树中,左边缘指定为0,右边缘指定为1。我使用两种方法来检索代码。

public ArrayList<Code> getCodes() {
        ArrayList<Code> code = new ArrayList<Code>();
        if (root == null) return null;
        traverse(code, root.left, "0");
        traverse(code, root.right, "1");
        return code;
}


private void traverse(ArrayList<Code> code, BinaryTreeNode<Letter> node, String prefix) {
        
    if(node==null){
        code.add(new Code(node.getElement().getLetter(), prefix));
    }
    else if (node.getLeft()!=null){
        traverse(code, node.getLeft(), prefix + "0");
    }
    else if (node.getRight()!=null){
        traverse(code, node.getRight(), prefix + "1");
    }

}

但是我得到的输出不正确。它应该看起来像这样,显示我的所有代码:

Start

Size of codes is 27

Code [ch= , code=00]

Code [ch=e, code=010]

Code [ch=n, code=0110]

Code [ch=i, code=0111]

Code [ch=b, code=100000]

Code [ch=p, code=100001]

Code [ch=y, code=100010]

Code [ch=g, code=100011]

Code [ch=o, code=1001]

[...]

但是,我得到了这个:

Start

Size of codes is 0

我的代码/字符/任何东西似乎都没有保存到我的 ArrayList 中。对于可能出现的问题有什么建议吗?

最佳答案

有两个问题:

  • 如果getLeft不为null,traverse将不会调查getRight
  • traverse 仅当 getLeftgetRight 不为 null 时才进行递归。这意味着您永远不会将 null 发送到 traverse 方法,但只有在 null 发送到 traverse 方法时才将结果添加到 code 数组(即从不发送)。

遍历方法大概应该是:

if(node==null){
    code.add(new Code(node.getElement().getLetter(), prefix));
} else {
    traverse(code, node.getLeft(), prefix + "0");
    traverse(code, node.getRight(), prefix + "1");
}

您还可以通过从 traverse(code, root, ""); 开始(而不是 traverse(...left)traverse(...right))来使代码稍微更奇特(更短)

关于java - Java中从哈夫曼树方法获取代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46881984/

相关文章:

Java Spring 资源服务器似乎在响应时检查 JWT token

java - 使用 Selenium 下载脚本文件,这种类型的文件可能会损害您的计算机弹出窗口

java - JVM是否调用匿名类的默认构造函数来创建实例?

java - 增加 2gig+ XML 文件的 JAVA 堆空间

c++ - 霍夫曼编码其中一个函数内部的逻辑错误

c++ - 二叉树形成错误

image - 霍夫曼代码表

zlib - DEFLATE (zlib, gzip) 格式使用的编码动态霍夫曼树的最大大小是多少?

java - 以秒为单位获取当前时间并将其保存为整数

c - 将一行数据存储到文件中