用霍夫曼树解码消息

时间:2012-11-19 23:32:26

标签: java huffman-code

当我发送一串要解码的位时,似乎需要一个额外的位来正确解码。我已经预先打印出了树,我在纸上画了树,以确保我没有遗漏任何东西。预订和我绘制的树匹配,但生成正确字母所需的位是关闭的。

public void decode(String code){
    String result = "";
    TreeNode current = root;
    current.preOrder();
    for(int i = 0;i < code.length();i++){
        //left--0
        if(Character.getNumericValue(code.charAt(i))==0){
            if(current.getLeft() == null){
                result += current.getWeight().getLetter();
                current = root;
                i--;
            }else
                current=current.getLeft();
        }
        //right--1
        else if(Character.getNumericValue(code.charAt(i))==1){
            if(current.getRight() == null){
                result += current.getWeight().getLetter();
                current = root;
                i--;
            }else
                current=current.getRight();
        }
    }
    System.out.println(result);
}

我的树每次都正确构建,这让我相信错误在解码方法中。但是,我似乎无法弄清楚为什么它需要额外的位。

1 个答案:

答案 0 :(得分:1)

如果没有看到你的节点是如何布局的,我只能猜测。当向左/向右移动时,您可能需要检查是否已落在叶节点上并发出其角色(如果是)。

if (current.getLeft() == null) {
    ...
}
else {
    current = current.getLeft();
    if (current.isLeaf()) {
        result += current.getWeight().getLetter();
        current = root;
    }
}

右侧也是如此。

不要重复自己

为避免重复追加字符的两行并将当前节点重置为root四次,您可以改为设置一个标志并在for块的末尾进行检查。

boolean append = false;
if (Character.getNumericValue(code.charAt(i)) == 0) {
    if (current.getLeft() == null) {
        append = true;
        i--;
    }
    else {
        current = current.getLeft();
        if (current.isLeaf()) {
            append = true;
        }
    }
}
// same for right side ...
if (append) {
    result += current.getWeight().getLetter();
    current = root;
}

其他提示

  • if0的两个1支票转换为switch,其中defaultIllegalArgumentException
  • for循环切换为while以避免预先递减i,只是让它再次递增并避免停止循环。
  • append设置为true开始,因为六个案例中有四个附加。