我有一个包含所有节点的DataTable。他们被序列化到数据库。我想创建一个数据的对象图(分层)表示。似乎有一些方法可以做到这一点。
This article describes a high order method(意味着在完全构建树之前需要大量搜索DataTable)
是否存在Order-N方法?在我的情况下,我已经将DataTable中树的节点预先排序为有序形式。意思是,第一行显示父项的NULL,因为它是根。每个后续行都按in-order notation排序。
我似乎回想起我上学期间的订单式N方法。但我不记得了。
我的DataTable架构类似于:
答案 0 :(得分:2)
这是一个应该做你需要做的事情的算法。它假设您的数据是有序的,因此它在O(n)中执行。
首先,您需要一个如下所示的节点:
class Node {
Node Parent;
List<Node> Children = new List<Node>();
int NodeId;
string Data;
public Node(NodeRow row) { ... }
}
current
。newRow.ParentNodeId
与current.NodeId
进行比较。current = current.Parent
newRow
添加到current.Children
并将current
设置为新行。就是这样!如果您的数据保证结构正确,那么您无需进行任何额外的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;
}