1.模型定义
public class TreeNode
{
public string Id { get; set; }
public string Name { get; set; }
public string ParentId { get; set; }
public List<TreeNode> Children { get; set; } = new List<TreeNode>();
}
2.数据模拟
var nodes = new List<TreeNode>
{
new TreeNode { Id = "1", Name = "Root", ParentId = "0" },
new TreeNode { Id = "2", Name = "Child1", ParentId = "1" },
new TreeNode { Id = "3", Name = "Child2", ParentId = "1" },
new TreeNode { Id = "4", Name = "Grandchild", ParentId = "2" }
};
3.双循环实现
public List<TreeNode> BuildTree(List<TreeNode> nodes)
{
var nodeDict = nodes.ToDictionary(n => n.Id);
var rootNodes = new List<TreeNode>();
foreach (var node in nodes)
{
if (node.ParentId == "0")
{
rootNodes.Add(node);
}
else if (nodeDict.TryGetValue(node.ParentId, out var parent))
{
parent.Children.Add(node);
}
}
return rootNodes;
}
此方法时间复杂度为O(n);
优于递归的方式,数据量大的时候推荐使用双循环的方式