2009-06-25 14 views
1

私はそれぞれがid、親ノードの集合、子ノードの集合を持つ一連のTreeNodeを持っています。オブジェクトツリーを効率的に処理するには?

与えられたノードIDについて、私はそのノードを通過するすべてのリンクを効率的に生成する方法を探しています。つまり、ノードで開始し、すべての子を反復処理します。ノードに複数の子がある場合は、各子のリンクを作成します。

私はまた、親ノードを通して「上向き」の方向にこれを行うことができるようにしたいと思います。

これを行う簡単なアルゴリズムはありますか?

EDIT:ああ、私は与えられたチェーン内のすべてのノードのIDの出力にできるようにしたいのですが...まあ

+0

「そのノードを通過するリンク」という意味を教えてください。 – akarnokd

+0

パスを参照している可能性があります。 視覚: グラフ構造はかなり静的か、または非常に揮発性ですか? 時間効率や空間効率をお探しですか? – alphazero

答えて

3

を持ってしまうではないだろう、ということを確認してください。最初はそれは以下のものではありません(これは深さの最初の検索です)。

Visit(Node node) 
{ 
    foreach (Node childNode in node.Children) 
    { 
     Visit(childNode); 
    } 

    DoStuff(node); 
} 

問題は、グラフにサイクルが含まれている可能性があるため、アルゴリズムが無限ループに入ることです。この問題を回避するには、訪問したノードをフラグしたり、コレクションに格納したりすることによって覚えておく必要があります。グラフがサイクルを持たない場合(例えばツリーの場合)、この短いアルゴリズムはすでに動作します。

ところで、TreeNodeに複数の親がある場合、それはツリーではなくグラフノードです。

0

、ノードは親への参照を持っている場合、それは同じくらい簡単です再帰的に親を取得する(ツリー内では、各ノードには親が1つのみ(またはルートであればすべてがない)親を取得する。

幅優先探索を使用するよりも、親ノードのコレクションを初期設定しています。

- EDIT -

ノードに複数の親があると、グラフを扱うことになります。 graph traversal algorithmsもあります(側面の表を参照)。

は、あなたのグラフがサイクルを持っている場合、あなたはあなたがBreadth FirstまたはDepth First Searchを探している無限ループ

+0

私は自分の用語がやや汚れていると思います。ノードは複数の親を持つことができますが、最終的にすべての親リンクはルートノードに委ねられます。 – PaulJWilliams

0

depthFirstEnumeration()breadthFirstEnumeration()をチェックしてください。しかし、これはボトムアップ方式でツリーをナビゲートしたいという問題を解決するものではありません。

関連する問題