C#高级:递归4-根据一颗树递归天生数据列表

打印 上一主题 下一主题

主题 844|帖子 844|积分 2534

一、目的

        该步伐展示了如何将树形结构的数据(比方家庭成员信息)转化为一维列表情势,以便于存储、展示或操作。
二、流程思绪


  • 创建树:起首通过 GetDemoTree 创建一个简单的家庭树,树的根节点是“爸爸”,然后通过父子关系构造出完整的树结构。
  • 递归转换:通过 GetListTree 方法,将该树结构转化为一维列表。在这个过程中,树的每个节点都会被递归遍历,并转换为 TreeList<ersonTree> 情势的条目,保存节点的层级信息(Level)和节点的具体数据(Data)。
  • 结果:最终天生的 listTree 是一个平展的、按层级排列的列表,可以用于展示、处理或者进一步的分析。
三、代码展示

  1. using System;
  2. using System.Collections.Generic;
  3. class PersonTree
  4. {
  5.     public int Id { get; set; }
  6.     public int? ParentID { get; set; }
  7.     public string Name { get; set; }
  8.     public List<PersonTree> Children = new List<PersonTree>();
  9. }
  10. class TreeList<T> where T : class, new()
  11. {
  12.     /// <summary>
  13.     /// 树ID(从T获取)
  14.     /// </summary>
  15.     public string Id { get; set; }
  16.     /// <summary>
  17.     /// 树的父级的ID(从T获取)
  18.     /// </summary>
  19.     public string PId { get; set; }
  20.     /// <summary>
  21.     /// 树的层级(从1开始)
  22.     /// </summary>
  23.     public int Level { get; set; }
  24.     /// <summary>
  25.     /// 树的对应节点的实体(如果数据量太大了,可以不写这个属性,把需要的属性例如Name放到外面去)
  26.     /// </summary>
  27.     public T Data { get; set; } = new T();
  28. }
  29. class Program
  30. {
  31.     static void Main()
  32.     {
  33.         //获取测试树:爸爸 - 我 妹妹 - 儿子 女儿
  34.         var demoTree = GetDemoTree();
  35.         //把树递归后转化为一维列表
  36.         List<TreeList<PersonTree>> listTree = GetListTree(demoTree);
  37.         ;
  38.     }
  39.     private static List<TreeList<PersonTree>> GetListTree(PersonTree demoTree, int level = 1)
  40.     {
  41.         List<TreeList<PersonTree>> output = new List<TreeList<PersonTree>>();
  42.         // 每次递归都会new出output,因此不会反复添加根节点
  43.         output.Add(new TreeList<PersonTree>
  44.         {
  45.             Id = demoTree.Id.ToString(),
  46.             PId = demoTree.ParentID.ToString(),
  47.             Level = level,
  48.             Data = demoTree
  49.         });
  50.         // 如果有子节点,递归调用,增加层级
  51.         if (demoTree.Children != null)
  52.         {
  53.             foreach (var item in demoTree.Children)
  54.             {
  55.                 output.AddRange(GetListTree(item, level + 1));  // 递归调用时传递新的层级
  56.             }
  57.         }
  58.         return output;
  59.     }
  60.     public static PersonTree GetDemoTree()
  61.     {
  62.         // 创建爸爸节点
  63.         PersonTree dad = new PersonTree
  64.         {
  65.             Id = 1,
  66.             Name = "爸爸",
  67.             ParentID = null
  68.         };
  69.         // 创建我节点
  70.         PersonTree me = new PersonTree
  71.         {
  72.             Id = 2,
  73.             Name = "我",
  74.             ParentID = dad.Id
  75.         };
  76.         // 创建妹妹节点
  77.         PersonTree sister = new PersonTree
  78.         {
  79.             Id = 3,
  80.             Name = "妹妹",
  81.             ParentID = dad.Id
  82.         };
  83.         // 创建儿子节点
  84.         PersonTree son = new PersonTree
  85.         {
  86.             Id = 4,
  87.             Name = "儿子",
  88.             ParentID = me.Id
  89.         };
  90.         // 创建女儿节点
  91.         PersonTree daughter = new PersonTree
  92.         {
  93.             Id = 5,
  94.             Name = "女儿",
  95.             ParentID = me.Id
  96.         };
  97.         // 将儿子和女儿添加为我的子节点
  98.         me.Children.Add(son);
  99.         me.Children.Add(daughter);
  100.         // 将我和妹妹添加为爸爸的子节点
  101.         dad.Children.Add(me);
  102.         dad.Children.Add(sister);
  103.         return dad;
  104.     }
  105. }
复制代码
【思考】假如PersonTree 没有 ParentID 这个字段 应该如何递归天生一维列表呢
【答案】递归方法多加一个Parent字段
  1. private static List<TreeList<PersonTree>> GetListTree(PersonTree demoTree, int level = 1, string parentId = null)
  2. {
  3.     List<TreeList<PersonTree>> output = new List<TreeList<PersonTree>>();
  4.     // 每次递归都会new出output,因此不会反复添加根节点
  5.     output.Add(new TreeList<PersonTree>
  6.     {
  7.         Id = demoTree.Id.ToString(),
  8.         PId = parentId,
  9.         Level = level,
  10.         Data = demoTree
  11.     });
  12.     // 如果有子节点,递归调用,增加层级
  13.     if (demoTree.Children != null)
  14.     {
  15.         foreach (var item in demoTree.Children)
  16.         {
  17.             output.AddRange(GetListTree(item, level + 1, demoTree.Id.ToString()));  // 递归调用时传递新的父ID
  18.         }
  19.     }
  20.     return output;
  21. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81428

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表