C# 可以从列表中构建树吗?

C# 可以从列表中构建树吗?,c#,algorithm,C#,Algorithm,我有这样的数据结构: public class Node { public String Name {get; set;} public List<Link> Links {get; set;} } public class Link { public int Id {get; set;} } A是开始节点,D是结束节点。中间的节点按固定顺序排列。结果应该是从a到D的“路径”列表,该列表将是: A1->B2->C4->D6 A1->

我有这样的数据结构:

public class Node
{
    public String Name {get; set;}
    public List<Link> Links {get; set;} 
}

public class Link
{
    public int Id {get; set;}
}
A是开始节点,D是结束节点。中间的节点按固定顺序排列。结果应该是从a到D的“路径”列表,该列表将是:

A1->B2->C4->D6
A1->B2->C5->D6
A1->B3->C4->D6
A1->B3->C5->D6

可以使用哪种算法获得上述结果?

看看这个递归实现:

using System;

public class Node {
    public String Name {get; set;}
    public int[] Links {get; set;} 
}

public class Program
{
    private static Node[] nodes = new[] {
        new Node { Name = "A", Links = new[] { 1 } },
        new Node { Name = "B", Links = new[] { 2, 3 } },
        new Node { Name = "C", Links = new[] { 4, 5 } },
        new Node { Name = "D", Links = new[] { 6 } }
    };

    private static void PrintPath(int depth, string path)
    {
        if (depth == nodes.Length) 
        {
            Console.WriteLine(path);
        }
        else 
        {
            foreach(var link in nodes[depth].Links)
            {
                PrintPath(
                    depth+1, 
                    string.Format("{0}{1}{2} ", path, nodes[depth].Name, link));
            }
        }
    }

    public static void Main()
    {
        PrintPath(0, string.Empty);
    }
} 

为了简单起见,我用
int
替换了
Link
类,并使用了数组而不是列表,但您应该明白了。

“是的,这是可能的”。在本例中,它只是简单地遍历树,就像使用简化的路径一样,并发出路径。没有“特殊算法”。@user2864740要构建树,是否应该创建额外的节点(例如A1、B2等),而不仅仅是A、B、C、D,并相应地链接这些额外节点?它们都是单独的“节点”。节点A1链接到[节点]B2和B3;B2到C4和C5,等等。在这种情况下,A*->B*->C*->D*您并没有试图构建一棵树。你试着用四个列表的笛卡尔积。出了点问题,信息“b2,3”是什么意思?究竟是什么标记了A和B节点之间的连接?这看起来在我的情况下可能会起作用。如何更改它以使递归函数返回路径列表?请查看上的实现。我正在尝试修改代码以返回路径列表,其中每个路径都是节点列表。我有这把小提琴,但它走错了路。怎么了?实现中的问题是行
path.Add(n)。您不能使用传入的
路径
,而是必须创建一个新实例(就像我在示例中对
字符串.Format(…)
所做的那样)。可在此处找到带有
列表的工作示例:
using System;

public class Node {
    public String Name {get; set;}
    public int[] Links {get; set;} 
}

public class Program
{
    private static Node[] nodes = new[] {
        new Node { Name = "A", Links = new[] { 1 } },
        new Node { Name = "B", Links = new[] { 2, 3 } },
        new Node { Name = "C", Links = new[] { 4, 5 } },
        new Node { Name = "D", Links = new[] { 6 } }
    };

    private static void PrintPath(int depth, string path)
    {
        if (depth == nodes.Length) 
        {
            Console.WriteLine(path);
        }
        else 
        {
            foreach(var link in nodes[depth].Links)
            {
                PrintPath(
                    depth+1, 
                    string.Format("{0}{1}{2} ", path, nodes[depth].Name, link));
            }
        }
    }

    public static void Main()
    {
        PrintPath(0, string.Empty);
    }
}