2012-01-30 12 views
5

私はこのように書き階層データを持っている:再帰の有無にかかわらず非バイナリツリーを構築するには?

+----------------------+-------+ 
| name     | depth | 
+----------------------+-------+ 
| ELECTRONICS   |  0 | 
| TELEVISIONS   |  1 | 
| TUBE     |  2 | 
| LCD     |  2 | 
| PLASMA    |  2 | 
| PORTABLE ELECTRONICS |  1 | 
| MP3 PLAYERS   |  2 | 
| FLASH    |  3 | 
| CD PLAYERS   |  2 | 
| 2 WAY RADIOS   |  2 | 
+----------------------+-------+ 

TUBE、LCDやプラズマテレビでの子です。 FLASHはMP3プレーヤーの子供です。 MP3プレイヤー、CDプレイヤー、2ウェイラジオはポータブル電子の子供です。あなたはドリルを手に入れます。

今、ツリーを構築するために、Idとその子を含むNodeという構造体があります。このように:の子である人を見つけることは容易であるので

struct Node 
{ 
    int id; 
    list<Node*> children; 
} 

各項目は、行番号(ELECTRONICS = 0、テレビ= 1など)IDによって識別されますノード。

これは私が構築しようとしているツリーです。このツリーはバイナリではありません。再帰を適用するのは簡単な考えのようには見えません。私が間違っているなら私を訂正してください。

どうすればいいですか?助けて!

+0

再帰では、2つ以上のパスを探索する場所が簡単になります。したがって、2つ以上の枝は再帰を容易に選択する。代替アプローチ(反復)では、進行状況を手動で追跡する必要があります(つまり、スタックが再帰バージョンで行っている作業を行う)。しかし、この状況では、再帰は必要ありません。 –

答えて

4

代わりにノードへのポインタを使用する必要があります。そうしないと、各レベルのツリーにデータが複製されます。

また、int idの代わりにenumを使用することをお勧めします。これにより、コードがより明確になります。

非バイナリツリーで再帰を使用しても問題はありません。のそれぞれの再帰関数呼び出しでleft/right(またはそれに類するもの)を呼び出す必要があります。このような

+0

意味があります。ありがとう! –

+0

アクセス時間は一定であるのに対し、リストではO(n)(定義によって)であるのに対し、リストの代わりにハッシュを使用するほうが良いでしょう。 –

0

再帰的にツリーを構築するためにツリーをバイナリにする必要はありません。これは、再帰的方法と非再帰的方法の両方で作成することができます。

私にとっては、トップダウン方式でツリーを構築します。つまり、子ノードの前に親ノードを作成します。私は消費量を線形にするために入力データを何とかソートします。新しいノードを追加するには、パラメータとして深さを与え、(ルートから下に向かって)0になるまで減らしてください。ノードがどこにあるのかが分かります。もちろん、ノードの親パスの情報が必要です。

+0

これはどのように動作するのかわかりません。私にコードのスニペットを教えてください。 –

0

何か:

int main() 
{ 
    Node flash(FLASH_ID); 
    Node mp3(MP3_ID); 

    mp3.children.push_back(flash); 
    // repeat 
} 
0

あなたが複数のリンクポインタを使用することができます。 すなわち

struct node 
{ 
int id; 
node *first_child; 
node *second child; 
node *third_child; 
} 

あなたは最高のあなたが別の子供たちと一緒にノードを指し、それらにアクセスすることができます。3. された場合には

。子供が3人未満の場合、NULLにすることができます。

関連する問題