我有一个对象列表,其中包含id和parent_id属性。
我希望构建一棵树来连接这些子父关系。
一个父类可能有多个子类,并且有一个对象将是所有对象的祖先。
最快的算法是什么?
我使用C#作为编程语言,但其他语言也可以。
我希望构建一棵树来连接这些子父关系。
一个父类可能有多个子类,并且有一个对象将是所有对象的祖先。
最快的算法是什么?
我使用C#作为编程语言,但其他语言也可以。
这样的东西应该就能解决问题:
public List<Node> MakeTreeFromFlatList(IEnumerable<Node> flatList)
{
var dic = flatList.ToDictionary(n => n.Id, n => n);
var rootNodes = new List<Node>();
foreach(var node in flatList)
{
if (node.ParentId.HasValue)
{
Node parent = dic[node.ParentId.Value];
node.Parent = parent;
parent.Children.Add(node);
}
else
{
rootNodes.Add(node);
}
}
return rootNodes;
}
var dict = new Dictionary<Id, Node>();
foreach (var item in items)
{
dict[item.Id] = new Node(item);
}
foreach (var item in items)
{
dict[item.ParentId].AddChild(dict[item.Id]);
}
public class Item
{
public string Id { get; set; }
public string ParentId { get; set; }
public IEnumerable<Item> GetChildItems(List<Item> allItems)
{
return allItems.Where(i => i.Id == this.ParentId);
}
}
public class Tree
{
public List<Item> Items { get; set; }
public IEnumerable<Item> RootItems(List<Item> allItems)
{
return allItems.Where(i => i.ParentId == null);
}
}