【问题标题】:How to traverse through a huffman tree and access stored characters?如何遍历霍夫曼树并访问存储的字符?
【发布时间】:2018-10-11 14:00:03
【问题描述】:

我正在尝试制作一个简单的程序,它将接受字符串输入,为每个字符生成节点,从这些节点生成霍夫曼树,创建将字符映射到其编码位的哈希图,并使用哈希图打印输入在霍夫曼编码中。

到目前为止,我已经成功了。我想做的下一个想法是解压缩压缩字符串。我的方法是使用霍夫曼树,从根开始,如果有分支,我会查看第一个压缩位,如果为零(0),那么它将转到左侧分支如果是一 (1),它将转到正确的分支。以这种方式继续下去,对于每个分支,每次都会考虑压缩位的下一个值,直到到达最后一个节点,并存储该节点中存储的字符。我的程序运行良好,但是调用函数时返回一个空字符串值。

在搜索答案时,我发现有人尝试过类似的方法并取得了成功,但对我来说并非如此。 Decoding Huffman Tree

这是我当前的代码。字符串数组包含拆分为单个字符的压缩字符串。

private  String generateHashTreeHelper(HuffmanTree t, String path, String[] arr) {
            int i = 0;
            while(i < arr.length){
                if(t.isLeaf()){
                    path = path + t.c;
                }
                else{
                    if(arr[i] == "0"){
                        generateHashTreeHelper(t.leftBranch, path + t.leftBranch.c, arr); 
                    }
                    else if(arr[i] == "1"){
                        generateHashTreeHelper(t.rightBranch, path + t.rightBranch.c, arr); 
                    }
                }
                i++;
            }
            return path;
        }

【问题讨论】:

  • 你有一个错字 arr[i] == "0",它永远不会是真的,因为你正在比较内存位置。使用 arr[i].equals("0").
  • @CésarFerreira 我在项目中使用 netbeans。这是 IDE 建议的,我确实尝试过,但是没有任何区别。它仍然返回空字符串

标签: java huffman-code


【解决方案1】:

我从C++ example完全翻译了代码。 它应该看起来像这样:

 public String decode(HuffmanTree root, String encodedString)
 {
        StringBuilder res = new StringBuilder();
        HuffmanTree node = root;
        Char[] characters = encodedString.toCharArray();

        for (int i = 0; i < characters.length; ++i) {
            if (characters[i].equals("0")) { // left child
                node = node.getLeft();
            } else { // rigth child
                node = node.getRight();
            }

            if (node.is_leaf() == true) {
                res.append(node.letter);
                node = root;
            }
        }

        return res.toString();
 }

当然,我假设您拥有 HuffmanTree 类以及此代码中使用的所有必需方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多