2

最適な二分探索木の事前順トラバーサルを .txt ファイルに再帰的に書き込みます。コードは次のとおりです。

 void PrintTree(int i, int j, int space)
{
    if(i < j)
    {
        outfile.write("", space++);
        outfile<<A[Rt[i][j]]<<endl;
         PrintTree(i, Rt[i][j], space);
         PrintTree(Rt[i][j] + 1, j, space);
    }
    else
    {
        outfile.write("",space);  //This line
         outfile.write("-\n",2);      
    }
}

この出力は、最大 7 ~ 10 のような小さなツリーで機能します。それを超えると、悪いキャラクターがいくつか出てきて、それらがどこから来たのかを見つけることができないようです.

F

 A

  -

  C

   B

    -

    -

   E

    D

    Ì-

    Ì-

    -

 K

  I

   H

    G

    Ì-

    Ì-

    -

   J

    -

    -

  M

   L

    -

    -

   O

    N

    Ì-

    Ì-

    -

私が得ている出力の例です。そのコードの「Ì」文字が何であるかはわかりません。

const int n = 15;
char A[n] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',  'O'};
int P[n] = {150, 25, 50, 25, 50, 125, 25, 75, 75, 50, 150, 75, 50, 25, 50};

 int S[n+1][n+1] = {};
 int Rt[n+1][n+1] = {};

これらはすべて私の初期配列です。(上記)

 PrintTree(0, n, 0);

print tree への最初の呼び出しです。S[][] は、コメントでリンクしたファイルの配列です...数字です。Rt[][] には、A[n] に対応する数値が含まれます。したがって、Rt[i][j] = 1; 'B' である A[1] にマップされます。

配列自体は範囲外にアクセスされているわけではなく、「スペース」が 4 以上になった場合にのみ発生するため、再帰の深さは 4 レベルになります。

4

1 に答える 1

2

これはほぼ確実に、再帰の深さを追跡する方法に問題があります。

outfile.write("",space);

ここでは、空の文字列の文字を出力するようにwrite()関数に指示しています。特定のレベルまでは、これは正常に機能しているように見えます (たとえば、指定した出力では常に深さ 5 で発生します)。space""Ì

調べるとostream& write (const char* s, streamsize n)、最初の引数として少なくとも n文字の配列を持つことを意図しており、2 番目の引数は書き込む文字数です。代わりに、次のようにする必要があります。

outfile << std::string(spaces, ' ') << '-' << std::endl;

これにより、長さのある空白の新しい文字列が作成され、ストリームに書き込まspacesoutfileます。

于 2013-07-15T01:40:23.477 に答える