从桌子上保湿一棵树

时间:2011-10-23 03:39:30

标签: c# database algorithm graph-algorithm

我有一个包含所有节点的DataTable。他们被序列化到数据库。我想创建一个数据的对象图(分层)表示。似乎有一些方法可以做到这一点。

This article describes a high order method(意味着在完全构建树之前需要大量搜索DataTable)

是否存在Order-N方法?在我的情况下,我已经将DataTable中树的节点预先排序为有序形式。意思是,第一行显示父项的NULL,因为它是根。每个后续行都按in-order notation排序。

我似乎回想起我上学期间的订单式N方法。但我不记得了。

我的DataTable架构类似于:

  • NodeID - int
  • ParentNodeId - nullable
  • 数据 - 字符串

1 个答案:

答案 0 :(得分: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 = current.Parent
  4. newRow添加到current.Children并将current设置为新行。
  5. 转到第2步。
  6. 就是这样!如果您的数据保证结构正确,那么您无需进行任何额外的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;
    }