http://rosettacode.org/wiki/Tree_traversal#C.2B.2Bからコードを取得し、SDL を使用して視覚化することにしました。ページ上の ASCII グラフィックは次のようになります。
1
/ \
/ \
/ \
2 3
/ \ /
4 5 6
/ / \
7 8 9
しかし、これまでに得た結果は次のようになります。
アスキー:
1
2
4 3
7 6
8
9
欠落している 5 に注意してください。その上に 6 が描画されます (位置のデバッグ出力によって確認されます)。
そして私の問題コード:
タイプミスの指摘に応えて、ソース ファイルからそのままコピーして貼り付けます。
void preorderTraverse(int x = osd.position.x, int y = osd.position.y) const {
osd.position.x = x;
osd.position.y = y;
std::cout << "Debug: " << x << " " << y << " " << getValue() << std::endl;
osd.put(getValue());
if(mLeft) { x -= 50; y += 30; mLeft->preorderTraverse(x, y);}
if(mRight) { x += 50; y += 30; mRight->preorderTraverse(x, y);}
}
トラバーサルの再帰的な性質を踏襲しているという考え方ですが、右側をトラバースすると問題が発生するようです。
次のように定義されているため、デフォルトのパラメーターを osd.position として設定していることに注意してください。
position.x = SCREEN_WIDTH / 2 - 50/2;
position.y = 0;
osd.put は次のとおりです。
SDL_Rect offset = get_offset(num);
SDL_BlitSurface( number_chart_, &offset, screen, &position );
offset は、ソースの四角形です (つまり、イメージをブリッティングします)。 get_offset は、単純に数値のスプライト シートをスライスします。
私の質問は、preorderTraverse を ASCII グラフィックのように修正するにはどうすればよいですか? ツリー全体の幅をチェックするなどの複雑なことをする必要はなく、適切にネストするだけです。