我正在尝试生成一个元素列表,如果可视化将生成树结构。
示例:
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
如果要使用此结构显示树:
为了使这项工作,这里是节点类:
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定义了吗?
答案 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});