1

デコードするビット列を送信すると、適切にデコードするには追加のビットが 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;
    }
}

右側も同様です。

繰り返さないで

文字を追加して現在のノードをルートに 4 回リセットする 2 行の重複を避けるために、代わりにフラグを設定し、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;
}

その他のヒント

  • またはの2 つのifチェックから、をスローするaを持つに切り替えます。01switchdefaultIllegalArgumentException
  • forループを aに切り替えて、再度インクリメントするためだけにwhile事前デクリメントiを回避し、ループの停止を回避します。
  • 6 つのケースのうち 4 つが追加されるため、 appendset toから始めます。true
于 2012-11-19T23:59:07.523 に答える