一尘不染

如何从平面结构有效地构建树?

algorithm

我有一堆扁平结构的物体。这些对象具有IDParentID属性,因此可以排列在树中。它们没有特定的顺序。每个ParentID属性不一定都与ID结构中的匹配。因此,它们可能是从这些对象中冒出来的几棵树。

您将如何处理这些对象以创建结果树?

我离解决方案并不遥远,但我敢肯定,这远非最佳方案…

我需要创建这些树,然后以正确的顺序将数据插入数据库。

没有循环引用。当ParentID == null或在其他对象中找不到ParentID时,节点是RootNode


阅读 302

收藏
2020-07-28

共1个答案

一尘不染

将对象的ID存储在映射到特定对象的哈希表中。枚举所有对象,并找到它们的父对象(如果存在),并相应地更新其父指针。

class MyObject
{ // The actual object
    public int ParentID { get; set; }
    public int ID { get; set; }
}

class Node
{
    public List<Node> Children = new List<Node>();
    public Node Parent { get; set; }
    public MyObject AssociatedObject { get; set; }
}

IEnumerable<Node> BuildTreeAndGetRoots(List<MyObject> actualObjects)
{
    Dictionary<int, Node> lookup = new Dictionary<int, Node>();
    actualObjects.ForEach(x => lookup.Add(x.ID, new Node { AssociatedObject = x }));
    foreach (var item in lookup.Values) {
        Node proposedParent;
        if (lookup.TryGetValue(item.AssociatedObject.ParentID, out proposedParent)) {
            item.Parent = proposedParent;
            proposedParent.Children.Add(item);
        }
    }
    return lookup.Values.Where(x => x.Parent == null);
}
2020-07-28