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

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

相关文章:

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

一、目的 该程序展示了如何将树形结构的数据&#xff08;例如家庭成员信息&#xff09;转化为一维列表形式&#xff0c;以便于存储、展示或操作。 二、流程思路 创建树&#xff1a;首先通过 GetDemoTree 创建一个简单的家庭树&#xff0c;树的根节点是“爸爸”&#xff0c;然…...

PDFelement 特别版

Wondershare PDFelement Pro 是一款非常强大的PDF编辑软件&#xff0c;它允许用户轻松地编辑、转换、创建和管理PDF文件。这个中文特别版的软件具有许多令人印象深刻的功能&#xff0c;PDFelement Pro 提供了丰富的编辑功能&#xff0c;可以帮助用户直接在PDF文件中添加、删除、…...

云计算在医疗行业的应用

云计算在医疗行业的应用广泛而深入&#xff0c;为医疗服务带来了前所未有的变革。以下是对云计算在医疗行业应用的详细解析&#xff1a; ### 一、医疗数据共享与整合 云计算平台具有强大的数据存储和处理能力&#xff0c;使得医疗数据共享与整合成为可能。通过云计算平台&…...

(转)rabbitmq怎么保证消息不丢失?

RabbitMQ 可以通过以下多种机制来保证消息不丢失&#xff1a; 生产阶段 - 持久化队列和交换器&#xff1a; - 在声明队列和交换器时&#xff0c;将 durable 参数设置为 true &#xff0c;确保它们是持久化的。这样&#xff0c;即使 RabbitMQ 节点重新启动&#xff0c;队列和交…...

每日一题:链表中环的入口结点

文章目录 判断链表环的入口节点描述数据范围&#xff1a;复杂度要求&#xff1a;输入输出 示例代码实现思路解析注意事项&#xff1a; 判断链表环的入口节点 描述 给定一个链表&#xff0c;判断该链表是否存在环。如果存在环&#xff0c;返回环的入口节点&#xff1b;如果不存…...

k8s里面etcd的作用

etcd 是 Kubernetes 集群中一个至关重要的组件,它是一个开源的分布式键值存储系统,主要用于存储和管理 Kubernetes 集群的配置和状态信息。以下是 etcd 在 Kubernetes 中的具体作用和功能: ### 1. **集群状态存储** etcd 是 Kubernetes 集群的持久化存储后端,负责存储和管…...

使用 uniapp 开发微信小程序遇到的坑

0. 每次修改代码时&#xff0c;都会触发微信开发工具重新编译 终极大坑&#xff0c;暂未找到解决方案 1. input 无法聚焦问题 问题&#xff1a;在小程序开发工具中&#xff0c;input 会突然无法聚焦&#xff0c;重启也不行。但是真机调试可以正常聚焦。 解决办法&#xff1a…...

AlphaPi相关硬件驱动提取

初涉硬件编程&#xff0c;在咸鱼上搞了几块AlphaPi和microbit的板鼓捣了一下&#xff0c;alphapi生态不完善&#xff0c;网上又无任何文档&#xff0c;搞封闭&#xff0c;可玩性实在有限&#xff0c;但貌似相关扩展板是可以插microbit的&#xff0c;于是想把这些扩展版用microb…...

【学习笔记】数据结构(十)

内部排序 文章目录 内部排序10.1 概述10.2 插入排序10.2.1 直接插入排序10.2.2 其他插入排序10.2.2.1 折半插入排序(Binary Insertion Sort)10.2.2.2 2-路插入排序&#xff08;Two-Way Insertion Sort&#xff09;10.2.2.3 表插入排序&#xff08;Table Insertion Sort&#xf…...

Unity中 Xlua使用整理(二)

1.Xlua的配置应用 xLua所有的配置都支持三种方式&#xff1a;打标签&#xff1b;静态列表&#xff1b;动态列表。配置要求&#xff1a; 列表方式均必须是static的字段/属性 列表方式均必须放到一个static类 建议不用标签方式 建议列表方式配置放Editor目录&#xff08;如果是H…...

刚体变换矩阵的逆

刚体运动中的变换矩阵为&#xff1a; 求得变换矩阵的逆矩阵为&#xff1a; opencv应用 cv::Mat R; cv::Mat t;R.t(), -R.t()*t...

高等数学-----极限、函数、连续

考研数学笔记...

ubuntu 创建服务、查看服务日志

1. 在 /etc/systemd/system/ 下创建文件&#xff0c;名称为 xxx.service [Unit] DescriptionYour Service Description Afternetwork.target[Service] Typesimple ExecStart/path/to/your/service/executable Restarton-failure[Install] WantedBymulti-user.target2. 配置服务…...

如何监控批量写入的性能瓶颈?

监控批量写入的性能瓶颈是优化数据写入过程的关键步骤。通过系统化的监控和分析,可以识别出影响性能的具体环节,并采取相应的优化措施。以下是详细的监控方法和步骤: ### 1. **数据库性能监控** #### a. **数据库内置监控工具** 大多数数据库系统都提供了内置的性能监控工…...

Ubuntu挂载Windows 磁盘,双系统

首先我们需要在终端输入这个命令&#xff0c;来查看磁盘分配情况 lsblk -f 找到需要挂载的磁盘&#xff0c;检查其类型&#xff08; 我的/dev/nvme2n1p1类型是ntfs&#xff0c;名字叫3500winData&#xff09; 然后新建一个挂载磁盘的目录&#xff0c;我的是/media/zeqi/3500wi…...

【雷达】雷达的分类

文章目录 前言类别性质主要雷达分系统及其现代技术发展国外发展 前言 前言 类别 性质 按作用分类 军用雷达&#xff1a;&#xff08;按载体&#xff09;地面雷达、舰载雷达、机载雷达、星载雷达、 艇载雷达、弹载雷达 民用雷达&#xff1a;交通管制雷达、港口管制雷达、气象雷…...

Word中所有的通配符使用方式[Word如何批量删除中文标点符号,英文标点符号,英文字母符号,数字符号,中文汉字符号]

Word中所有的通配符使用方式 概念讲解通配符一览表详细介绍通配符的使用使用通配符搜索简洁通配符链接操作演示链接 概念讲解 Word中的通配符是用在查找和替换中的正则表达式。通配符可以实现高级的查找替换&#xff0c;快速整理和排版文档。常用的通配符包括&#xff1a; “*…...

OpenCV相机标定与3D重建(43)用于计算矫正和重映射的变换函数initUndistortRectifyMap()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算畸变矫正和校正变换映射。 该函数计算联合的畸变矫正和校正变换&#xff0c;并以 remap 所需的地图形式表示结果。矫正后的图像看起来像是原…...

ansible-api分析(Inventory)

一. 简述&#xff1a; 通过ansible 实现系统初始化功能&#xff0c; 为和平台嵌入&#xff0c; 需要通过ansible的api进行功能实现。 准确来说&#xff0c;ansible并没有纯粹的外部接入api功能&#xff0c; 只是官方提供了原生类&#xff0c;用于继承接入&#xff0c;从而实现a…...

使用FDBatchMove的几个问题总结

FDBatchMove的使用&#xff0c;搞了好久&#xff0c;今天终于解决了自己的几个问题&#xff0c;网上很少例子&#xff0c;记录一下&#xff0c;仅做参考。 1、使用firedac导入excel表&#xff0c;需要access database驱动&#xff0c;不要使用2007&#xff0c;一定要使用2010&…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

Git 命令全流程总结

以下是从初始化到版本控制、查看记录、撤回操作的 Git 命令全流程总结&#xff0c;按操作场景分类整理&#xff1a; 一、初始化与基础操作 操作命令初始化仓库git init添加所有文件到暂存区git add .提交到本地仓库git commit -m "提交描述"首次提交需配置身份git c…...