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