您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页C#高级:递归4-根据一颗树递归生成数据列表

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

来源:五一七教育网

一、目的

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

二、流程思路

三、代码展示

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;
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务