我正在尝试制作一个简单的程序,该程序将接受字符串输入,为每个字符生成节点,从这些节点生成霍夫曼树,创建将字符映射到其编码位的哈希图,并使用哈希图打印输入在霍夫曼编码中。
到目前为止,我已经成功了。下一个我想做的就是解压缩压缩后的字符串。我的方法是以这样的方式使用霍夫曼树:从根开始,如果有分支,我将查看第一个压缩位,如果它为零(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;
}
答案 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
类以及此代码中使用的所有必需方法。