如何遍历霍夫曼树并访问存储的字符?

时间:2018-10-11 14:00:04

标签: java huffman-code

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

到目前为止,我已经成功了。下一个我想做的就是解压缩压缩后的字符串。我的方法是以这样的方式使用霍夫曼树:从根开始,如果有分支,我将查看第一个压缩位,如果它为零(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;
        }

1 个答案:

答案 0 :(得分:0)

我从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类以及此代码中使用的所有必需方法。