C#手动排序列表中的父/子树元素

时间:2016-10-13 17:28:36

标签: c# algorithm recursion tree treeview

我正在尝试生成一个元素列表,如果可视化将生成树结构。

示例:

Element 1 -> 1, 0 //ID is 1 & Parent ID is 0 (0 = root)
Element 2 -> 2, 0 //ID is 2 & Parent ID is 0 (0 = root)
Element 3 -> 3, 1 //ID is 3 & Parent ID is 1
Element 4 -> 4, 3
Element 5 -> 5, 2

如果要使用此结构显示树:

enter image description here

为了使这项工作,这里是节点类:

public class Node
{
    public string id;
    public string parentId;
    public List<Node> children = new List<Node>();  
}
  

与树类似,节点可能包含父节点,也可能包含多个其他节点   子节点

任务是将元素分类到适当的层次结构&amp;将子元素添加到其各自父级的子集合中。我脑子里有两种方法:

1)循环方法

i)Loop&amp;找到Base / root节点(父节点为0的节点)

ii)Loop&amp;找到基节点为其父节点的节点

iii)将它们添加到基本节点的子集合

然而,上述方法最适用于深度为2的树,这意味着根和&amp;他们直接的孩子水平。想象一下具有多个复杂级别的树。这种方法不会为此工作。

这是我迄今为止所尝试过的。

2)&#39;递归&#39;方法

第二种方法是&#39;递归&#39;方法。这似乎是我无法弄清楚的。任何人都可以帮我解决这个问题吗?

以前有人试图解决这个问题吗?如何安排包含&#39; n&#39;带有父ID和元素的元素数量ID定义了吗?

2 个答案:

答案 0 :(得分:2)

如果我理解正确,你有一个单独的List<Node>,你想要填充children属性,最后得到一个根节点列表。

这可以通过id(如Dictionary)和源列表上的单次迭代构建快速查找结构来有效实现。对于每个节点,您将找到父节点并将节点添加到父children列表(如果没有父节点,则添加到根列表)。算法的时间复杂度为O(N)。

static List<Node> BuildTree(List<Node> nodes)
{
    var nodeMap = nodes.ToDictionary(node => node.id);
    var rootNodes = new List<Node>();
    foreach (var node in nodes)
    {
        Node parent;
        if (nodeMap.TryGetValue(node.parentId, out parent))
            parent.children.Add(node);
        else
            rootNodes.Add(node);
    }
    return rootNodes;
}

答案 1 :(得分:-2)

通常这样做

             DataTable dt = new DataTable();
             dt.Columns.Add("id", typeof(int));
             dt.Columns.Add("parent", typeof(int));

             dt.Rows.Add(new object[] { 1,0});
             dt.Rows.Add(new object[] { 2,0});
             dt.Rows.Add(new object[] { 3,1});
             dt.Rows.Add(new object[] { 4,3});
             dt.Rows.Add(new object[] { 5,2});