web-dev-qa-db-ja.com

C#でオブジェクトのツリーをトラバースする

複数のオブジェクトで構成されるツリーがあります。各オブジェクトには、名前(string)、ID(int)、および場合によっては同じタイプの子の配列があります。ツリー全体を調べて、すべてのIDと名前を出力するにはどうすればよいですか?

私はプログラミングに不慣れで、率直に言って、レベルがいくつあるかわからないため、これに頭を悩ませるのに苦労しています。現在、foreachループを使用して、ルートのすぐ下にある親オブジェクトをフェッチしていますが、これは子を取得できないことを意味します。

19
BeefTurkey

再帰を使用するアルゴリズムは次のようになります。

printNode(Node node)
{
  printTitle(node.title)
  foreach (Node child in node.children)
  {
    printNode(child); //<-- recursive
  }
}

これは、再帰がどれだけ深くネストされているかも追跡するバージョンです(つまり、ルートの子、孫、ひ孫などを印刷しているかどうか):

printRoot(Node node)
{
  printNode(node, 0);
}

printNode(Node node, int level)
{
  printTitle(node.title)
  foreach (Node child in node.children)
  {
    printNode(child, level + 1); //<-- recursive
  }
}
46
ChrisW

ええと、あなたはいつでも再帰を使うことができます、しかし「現実世界」のプログラミングシナリオでは、あなたが深さを追跡しなければそれは悪いことにつながる可能性があります。

バイナリツリーに使用される例を次に示します。 http://www.codeproject.com/KB/recipes/BinarySearchTree.aspx

データ構造全体に慣れていない場合は、リンクリストやその他のツリー構造をグーグルで検索します。持っているべき知識は豊富です。

0
Alex Fort