1

こんにちは私は文字を見つけるためにツリーを再帰的に検索する方法とその文字に到達するためのバイナリコードを理解しようとしています。基本的に目標は、キャラクターのコードを見つけてファイルに書き込むことです。ファイルライターの部分は問題ありませんが、本当の問題はバイナリコードを文字列に入れることです。キャラクターを探している間。助けてください!

これは再帰的メソッドのコードです:

public String biNum(Frequency root, String temp, String letter)
{
    //String temp = "";
    boolean wentLeft = false;
    if(root.getString() == null && !wentLeft)
    {
        if(root.left.getString() == null)
        {
            temp = temp + "0";
            return biNum(root.left, temp, letter);
        }
        if(root.left.getString().equals(letter))
        {
            return temp = temp + "0";
        }
        else
        {
            wentLeft = true;
            temp = temp.substring(0, temp.length() - 1);
            return temp;
        }
    }
    if(root.getString() == null && wentLeft)
    {
        if(root.right.getString() == null)
        {
            temp = temp + "1";
            return (biNum(root.right, temp, letter));
        }
        if(root.right.getString().equals(letter))
        {
            return temp = temp + "1";
        }
        else
        {
            wentLeft = false;
            temp = temp.substring(0, temp.length() - 1);
            return temp;
        }

    }
    return temp;


}

これはFrequencyクラスです。

package huffman;

publicclassFrequencyはComparable{privateStrings;を実装します。private int n; パブリック周波数が残っています。公的周波数権; プライベート文字列biNum; プライベート文字列リーフ;

Frequency(String s, int n, String biNum)
{
    this.s = s;
    this.n = n;
    this.biNum = biNum;
}
public String getString()
{
    return s;
}
public int getFreq()
{
    return n;
}
public void setFreq(int n)
{
    this.n = n;
}
public String getLeaf()
{
    return leaf;
}
public void setLeaf()
{
    this.leaf = "leaf";
}
@Override
public int compareTo(Object arg0) {
    Frequency other = (Frequency)arg0;

    return n < other.n ? -1 : (n == other.n ? 0 : 1);

}

}

4

1 に答える 1

1

あなたの更新版では、 を再検討する必要があると思いますreturn biNum(root.left, temp, letter);。具体的には、ツリー全体のルート ノードに葉ではない左の子 (したがってroot.left.getString() == null) があるが、求める値がツリー全体のルート ノードの右の子から派生している場合はどうなるでしょうか。

たとえば、次のツリーを考えてみましょう。

          26
         /  \
        /    \
       /      \
      11      15
     /  \    /  \
    /    B  A    \
   6     5  6     9
  / \            / \
 D   \          C  sp
 3    3         4  5
     / \
    E   F
    2   1

関数が文字 C を探してたどるステップをトレースします。

おそらく、特定の文字を探すことなく、ツリー全体をトラバースする (そして、1 と 0 のパターンを構築する) ことを検討する必要がありますが、葉ノードを見つけたときに特定のアクションを実行する必要がありますか?

于 2010-07-23T01:59:25.930 に答える