2011-10-17 11 views
0

プログラミング割り当てのために、配列にツリーを順番にロードする必要があります。再帰関数の数値を増やす

再帰アルゴリズム自体は私にとっては問題ありません。私が持っている問題は、サブスクリプト/要素番号を定期的に増やしておくことで、呼び出しが戻った後にデータを適切な配列要素に上書きするのではなく、上書きすることです。

void foo(currentNode, data[], element?) 
{ 
    // base case 
    if (currentNode == NULL) 

    foo(currentNode->left, data, element?); 
    data[ element++ ] = currentNode->data; // what do I do in between the left and right subtree calls? 
    foo(currentNode->right, data, element?); 
} 

したがって、インオーダートラバーサルの場合、配列の次の部分にだけ増加するように要素を増やすにはどうすればよいですか?

ヒントは素晴らしいですが、私は解決策を気にしません。

答えて

1

あなたのデータパラメータのポインタへの参照を行います。

void foo(Node* currentNode, ContentType*& data) { 
    //... 
    *data++ = currentNode->data; 
    //.. 
} 
0

私は正しい、あなたを理解している場合は、あなたが必要とするすべては、あなたがfoo

の各呼び出しで(より正確に値が、要素が上を向いている)要素の値を変更することができ、ポインタこれで

void foo(currentNode, data[], int &element) 

foo(currentNode->left, data, element); 
data[ element++ ] = currentNode->data; 

です

+1

それはC++ですので、**参照を使用**、してください。 –

+0

申し訳ありませんが私は非常にプレーンCで書いているので、私は非常に参照に精通していないが、私の投稿を編集して自由に感じる – Hachi

+0

Ok、参照を使用するように編集。参照をNULLに設定することはできません。削除できず、別のオブジェクトを参照するように変更することもできません。したがって、参照を使用する場合、参照を扱う際に参照する必要はありません。もちろん、参照として渡すオブジェクトが必要な時間だけ存在することを確認する必要があります。参照の唯一の欠点は、参照渡しがコールサイトで明白でないことです。出力引数が何であるかを覚えておく必要があります(出力引数を避け、できる限りどこでもリターンを使用するのが最善です)。 –