C# 将数据组合为树形结构(List<Tree>)的通用方法 📅 发布时间:2026/8/22 15:50:58 👁 浏览次数: 目录步骤 1: 定义树节点类步骤 2: 构建树方法 1: 使用递归方法 2: 使用迭代广度优先搜索步骤 3: 使用树结构如果您喜欢此文章请收藏、点赞、评论谢谢祝您快乐每一天。在C#中将数据组合为树形结构通常涉及到创建树形节点类并使用递归或迭代方法来构建树。下面是一个通用的方法通过这种方式可以创建一个树形结构例如一个组织架构或文件系统树。步骤 1: 定义树节点类首先定义一个树节点类该类通常包含数据字段和指向子节点的引用。public class TreeNodeT{public T Data { get; set; }public ListTreeNodeT Children { get; set; }public TreeNode(T data){Data data;Children new ListTreeNodeT();}// 可选添加方法以添加子节点public void AddChild(TreeNodeT child){Children.Add(child);}}步骤 2: 构建树根据具体的数据和结构你可以使用递归或迭代方法来构建树。这里展示两种常见的方法方法 1: 使用递归假设你有一个数据源例如一个列表或数据库查询结果并且每个节点都有一个指向其父节点的ID。你可以使用递归来构建树。public class NodeData{public int Id { get; set; }public int? ParentId { get; set; } // 假设这是父节点的ID如果是根节点则为null或0public string Name { get; set; } // 示例数据字段}public static TreeNodeNodeData BuildTree(ListNodeData nodes){var lookup nodes.ToLookup(n n.ParentId); // 使用Lookup来快速查找子节点return BuildTreeRecursive(nodes, lookup, null); // 从ParentId为null的节点开始构建树}private static TreeNodeNodeData BuildTreeRecursive(ListNodeData nodes, ILookupint?, NodeData lookup, int? parentId){var currentNodes lookup[parentId].ToList(); // 获取当前父节点的所有子节点var treeNode new TreeNodeNodeData(currentNodes.First()); // 创建一个树节点使用当前子节点的第一个数据项作为节点数据如果有多个可以根据需要选择foreach (var node in currentNodes){treeNode.AddChild(BuildTreeRecursive(nodes, lookup, node.Id)); // 递归构建子树}return treeNode;}方法 2: 使用迭代广度优先搜索如果你更喜欢使用迭代方法可以尝试广度优先搜索BFS来实现。这通常涉及到队列的使用。public static TreeNodeNodeData BuildTreeIterative(ListNodeData nodes){var root new TreeNodeNodeData(nodes.First(n n.ParentId null)); // 假设根节点是ParentId为null的节点var queue new QueueTreeNodeNodeData(); // 用于BFS的队列queue.Enqueue(root); // 将根节点加入队列while (queue.Count 0){var current queue.Dequeue(); // 取出当前节点foreach (var childData in nodes.Where(n n.ParentId current.Data.Id)) // 找到所有当前节点的子节点数据项{var childNode new TreeNodeNodeData(childData); // 为每个子节点创建一个树节点实例current.AddChild(childNode); // 将子节点添加到当前节点下queue.Enqueue(childNode); // 将子节点加入队列以供后续处理}}return root; // 返回根节点整个树已构建完成}步骤 3: 使用树结构现在你可以使用构建的树结构进行各种操作如遍历、搜索或显示树形结构等。例如遍历整个树public static void TraverseTree(TreeNodeNodeData node, ActionTreeNodeNodeData action){action(node); // 对当前节点执行操作foreach (var child in node.Children) // 递归遍历所有子节点{TraverseTree(child, action);}}通过这种方式你可以根据具体的数据和需求灵活地构建和使用树形结构如果您喜欢此文章请收藏、点赞、评论谢谢祝您快乐每一天。