当我发送一串要解码的位时,似乎需要一个额外的位来正确解码。我已经预先打印出了树,我在纸上画了树,以确保我没有遗漏任何东西。预订和我绘制的树匹配,但生成正确字母所需的位是关闭的。
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);
}
我的树每次都正确构建,这让我相信错误在解码方法中。但是,我似乎无法弄清楚为什么它需要额外的位。
答案 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;
}
其他提示
if
或0
的两个1
支票转换为switch
,其中default
会IllegalArgumentException
。for
循环切换为while
以避免预先递减i
,只是让它再次递增并避免停止循环。append
设置为true
开始,因为六个案例中有四个附加。