1

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

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

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

4

1 回答 1

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检查0或切换1到一个switch抛出default一个IllegalArgumentException.
  • for将循环切换到 awhile以避免预先递减i只是让它再次递增并避免停止循环。
  • append从设置为开始,true因为六个案例中有四个附加。
于 2012-11-19T23:59:07.523 回答