当前位置: 首页 > article >正文

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

一、目的

        该程序展示了如何将树形结构的数据(例如家庭成员信息)转化为一维列表形式,以便于存储、展示或操作。

二、流程思路

  1. 创建树:首先通过 GetDemoTree 创建一个简单的家庭树,树的根节点是“爸爸”,然后通过父子关系组织出完整的树结构。
  2. 递归转换:通过 GetListTree 方法,将该树结构转化为一维列表。在这个过程中,树的每个节点都会被递归遍历,并转换为 TreeList<PersonTree> 形式的条目,保存节点的层级信息(Level)和节点的详细数据(Data)。
  3. 结果:最终生成的 listTree 是一个平坦的、按层级排列的列表,可以用于展示、处理或者进一步的分析。

三、代码展示

using System;
using System.Collections.Generic;

class PersonTree
{
    public int Id { get; set; }
    public int? ParentID { get; set; }
    public string Name { get; set; }

    public List<PersonTree> Children = new List<PersonTree>();
}

class TreeList<T> where T : class, new()
{
    /// <summary>
    /// 树ID(从T获取)
    /// </summary>
    public string Id { get; set; }
    /// <summary>
    /// 树的父级的ID(从T获取)
    /// </summary>
    public string PId { get; set; }
    /// <summary>
    /// 树的层级(从1开始)
    /// </summary>
    public int Level { get; set; }
    /// <summary>
    /// 树的对应节点的实体(如果数据量太大了,可以不写这个属性,把需要的属性例如Name放到外面去)
    /// </summary>
    public T Data { get; set; } = new T();
}

class Program
{
    static void Main()
    {
        //获取测试树:爸爸 - 我 妹妹 - 儿子 女儿
        var demoTree = GetDemoTree();

        //把树递归后转化为一维列表
        List<TreeList<PersonTree>> listTree = GetListTree(demoTree);
        ;
    }

    private static List<TreeList<PersonTree>> GetListTree(PersonTree demoTree, int level = 1)
    {
        List<TreeList<PersonTree>> output = new List<TreeList<PersonTree>>();

        // 每次递归都会new出output,因此不会反复添加根节点
        output.Add(new TreeList<PersonTree>
        {
            Id = demoTree.Id.ToString(),
            PId = demoTree.ParentID.ToString(),
            Level = level,
            Data = demoTree
        });

        // 如果有子节点,递归调用,增加层级
        if (demoTree.Children != null)
        {
            foreach (var item in demoTree.Children)
            {
                output.AddRange(GetListTree(item, level + 1));  // 递归调用时传递新的层级
            }
        }

        return output;
    }


    public static PersonTree GetDemoTree()
    {
        // 创建爸爸节点
        PersonTree dad = new PersonTree
        {
            Id = 1,
            Name = "爸爸",
            ParentID = null
        };

        // 创建我节点
        PersonTree me = new PersonTree
        {
            Id = 2,
            Name = "我",
            ParentID = dad.Id
        };

        // 创建妹妹节点
        PersonTree sister = new PersonTree
        {
            Id = 3,
            Name = "妹妹",
            ParentID = dad.Id
        };

        // 创建儿子节点
        PersonTree son = new PersonTree
        {
            Id = 4,
            Name = "儿子",
            ParentID = me.Id
        };

        // 创建女儿节点
        PersonTree daughter = new PersonTree
        {
            Id = 5,
            Name = "女儿",
            ParentID = me.Id
        };

        // 将儿子和女儿添加为我的子节点
        me.Children.Add(son);
        me.Children.Add(daughter);

        // 将我和妹妹添加为爸爸的子节点
        dad.Children.Add(me);
        dad.Children.Add(sister);
        return dad;
    }
}

【思考】假如PersonTree 没有 ParentID 这个字段 应该如何递归生成一维列表呢

【答案】递归方法多加一个Parent字段

private static List<TreeList<PersonTree>> GetListTree(PersonTree demoTree, int level = 1, string parentId = null)
{
    List<TreeList<PersonTree>> output = new List<TreeList<PersonTree>>();

    // 每次递归都会new出output,因此不会反复添加根节点
    output.Add(new TreeList<PersonTree>
    {
        Id = demoTree.Id.ToString(),
        PId = parentId,
        Level = level,
        Data = demoTree
    });

    // 如果有子节点,递归调用,增加层级
    if (demoTree.Children != null)
    {
        foreach (var item in demoTree.Children)
        {
            output.AddRange(GetListTree(item, level + 1, demoTree.Id.ToString()));  // 递归调用时传递新的父ID
        }
    }

    return output;
}


http://www.kler.cn/a/471905.html

相关文章:

  • Linux服务器网络不通问题排查及常用命令使用
  • 《C++11》右值引用深度解析:性能优化的秘密武器
  • 计算机毕业设计Python中华古诗词知识图谱可视化 古诗词智能问答系统 古诗词数据分析 古诗词情感分析模型 自然语言处理NLP 机器学习 深度学习
  • 年会抽奖Html
  • PCL 分段线性函数
  • 行业商机信息付费小程序系统开发方案
  • 通过 ulimit 和 sysctl 调整Linux系统性能
  • ThinkPHP 8高效构建Web应用-获取请求对象
  • VUE条件树查询 自定义条件节点
  • 【JMeter】配置元件Config Element
  • 浅谈棋牌游戏开发流程四:核心业务逻辑(二)——房间匹配与对局流程
  • Java 日期时间格式化标准
  • 【HarmonyOS NEXT】鸿蒙应用实现屏幕录制详解和源码
  • 1.07 标准IO
  • 数据结构:LinkedList与链表—无头双向链表(二)
  • STM32 拓展 电源控制
  • 大数据架构设计:数据分层治理的全景指南
  • 人机交互复习笔记
  • ECharts系列:echart中折线图折线设置不平滑显示
  • 【Jsoncpp】manipulating JSON data in C++
  • 时间格式转换
  • 软件开发为什么要用CI/CD方法
  • 《量子比特大阅兵:不同类型量子比特在人工智能领域的优劣势剖析》
  • 如何制作一份好的年终总结PPT?-中小企实战运营和营销工作室博客
  • RAFT:随机退火森林
  • playwright 录制