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);
}
}