【问题标题】:Decoding a message with Huffman tree使用 Huffman 树解码消息
【发布时间】:2012-11-19 23:32:26
【问题描述】:

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

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);
}

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

【问题讨论】:

    标签: java huffman-code


    【解决方案1】:

    没有看到您的节点是如何布置的,我只能猜测。当向左/向右遍历时,您可能需要检查您是否已降落在叶节点上,如果是,则发出其字符。

    if (current.getLeft() == null) {
        ...
    }
    else {
        current = current.getLeft();
        if (current.isLeaf()) {
            result += current.getWeight().getLetter();
            current = 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;
    }
    

    其他提示

    • 从两个if 检查01 切换到一个switch,其中default 抛出一个IllegalArgumentException
    • for 循环切换到 while 以避免预先递减 i 只是为了让它再次递增并避免停止循环。
    • append 开始设置为 true,因为六分之四的情况附加。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-20
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 2023-03-19
      • 2019-02-13
      相关资源
      最近更新 更多