使用递归从列表构建树

时间:2013-11-14 04:56:41

标签: c# .net recursion tree

我已经做了很多搜索,但现有的解决方案都没有解决我的确切问题。我有一个清单:

Input[] inputs = new Input[]
{
    new Input(1),
    new Input(3,1),
    new Input(19,3),
    new Input(22,1),
    new Input(4,1),
    new Input(5,22),
};

以下是BuildTree()的声明,该声明目前不起作用:

public TreeNode BuildTree(IEnumerable<Input> inputs, TreeNode parentNode = null)
{
    List<Input> nodes = inputs.ToList<Input>();

    foreach (Input node in nodes)
    {
        TreeNode newNode = new TreeNode(node.Id);
        if (parentNode == null)
        {
            parentNode = BuildTree(nodes, newNode);
        }
        else
        {
            parentNode.AddChild(newNode);
        }
    }

    return parentNode;
}

以下是对BuildTree的调用:

TreeNode rootNode = BuildTree(inputs);

因此构建它时,BuildTree函数必须返回树的根。我试过循环输入。我尝试在每次迭代时从列表中删除第一个输入。我无法弄明白。任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:0)

您不需要递归,因为您正在将列表转换为树,而不是将树转换为列表。

由于您的输入列表不是标准树遍历,并且您没有告诉我们父节点是否总是位于子节点之前,因此我们可以使用的最简单方法是Dictionary

public TreeNode BuildTree(IEnumerable<Input> inputs)
{
    TreeNode rootNode = null;
    // Build a dictionary to store each input and its node
    var dict = inputs.ToDictionary(
        input => input.Id,
        input => new { Input = input, Node = new TreeNode(input.Id.ToString()) });

    // Iterate through the nodes and build relationship among them
    foreach(var value in dict.Values)
    {
        var input = value.Input;
        if(input.ParentId != null)
        {
            dict[(int)input.ParentId].Node.Nodes.Add(value.Node);
        }
        else
        {
            rootNode = value.Node;
        }
    }
    return rootNode;
}