2011-10-23 3 views
4

私はすべてのノードが入ったDataTableを持っています。それらはデータベースにシリアライズされました。私はデータのオブジェクトグラフ(階層的)表現を作成したい。これを行うにはいくつかの方法があるようです。テーブルからツリーを水和する

This article describes a high order method(ツリーが完全に構築される前に、それはのDataTableの検索の多くを必要とするという意味)

注文-Nのアプローチはありますか?私の場合は、DataTableのツリーのノードをインオーダー形式に事前ソートしました。意味は、最初の行は、ルートであるため、親に対してNULLを示します。後続の各行はin-order notationにソートされます。

私は学校時代からOrder-Nアプローチを思い出しているようです。しかし、私は覚えていない。

私のDataTableのスキーマは、このようになります。

  • のNodeID - NULL可能
  • データ - - ParentNodeId
  • をint型の文字列
+0

おそらく関連:http://stackoverflow.com/questions/444296/how-to-efficiently-build-a-tree-from-a-flat-structure辞書を使用しています親ノードを追跡することができ、おそらく最も簡単な方法です。私は辞書を必要としない再帰的な解法を使ってきましたが、それをもう一度派生させなければならないほど長いことでした。 –

+0

これは、オーダーフォームのようには見えません。その場合、rootはテーブルの最初のノードではありません。あなたは予約注文を意味しましたか? – svick

答えて

2

は、ここではそれを実行する必要が何をすべきなアルゴリズムです。あなたのデータは順序通りであると仮定し、O(n)で実行します。

class Node { 
    Node Parent; 
    List<Node> Children = new List<Node>(); 
    int NodeId; 
    string Data; 
    public Node(NodeRow row) { ... } 
} 
  1. currentとして最初の行をロードします。

    まず、あなたはこのようになりますノードを必要としています。

  2. 次の行をロードします。 newRow.ParentNodeIdcurrent.NodeIdを比較してください。
  3. あなたが一致するものを見つけるまで、current.ChildrennewRowを追加し、新しい行にcurrentを設定current = current.Parent
  4. を設定します。
  5. 行くことだ2.

をステップ!データが正しく構造化されていることが保証されている場合は、追加のnullチェックを行う必要はありません。

サンプル:

Node CreateTree(IEnumerable<NodeRow> rows) { 
    Node root = null; 
    Node current = null; 
    foreach (var row in rows) { 
     // Root: 
     if (root == null) { 
      root = current = new Node(row); 
      continue; 
     } 
     // Traverse up the tree until the parent is found: 
     while (row.ParentNodeId != current.NodeId) { 
      current = current.Parent; 
     } 
     // Add the new node as a child of the current one: 
     var rowNode = new Node(row); 
     rowNode.Parent = current; 
     current.Children.Add(rowNode); 
     current = rowNode; 
    } 
    return root; 
} 
+0

ありがとう!少し問題がありました。 Nodeクラスでは、Parentが完全に形成されたノードとしてリストされています。私が持っているのは親のIDだけです。親ノードを完全に形成するためには、各ノードのDataTableの検索を実行する必要があります。だから私たちはもう一度それに戻ります - 余分なルックアップ。私のデータベースから来るものは、親のIDを教えてくれるコラムです。行は順不同です。 – 010110110101

+0

申し訳ありませんが、私は行を忘れました: 'rowNode.Parent = current;'。新しい行ごとに、ツリーをたどって一致する 'ParentNodeId'を探します。次に、新しい 'rowNode.Parent'が' current'にセットされます。 –

+0

...データは "順序通り"なので、 'ParentNodeId'は' current'の先祖のものと一致しなければなりません。それは私たちに 'O(n)'を与えるものです! –

関連する問題