探讨Java中递归构建树形结构的算法

简介: 探讨Java中递归构建树形结构的算法

java递归获取树


当我们处理像部门树、菜单树等树形结构数据时,我们需要从后端获取一组扁平的数据列表。这些数据列表通常由一个父节点ID字段和一个当前节点ID字段组成,这样我们可以通过这两个字段建立节点之间的父子关系。然后,我们可以利用这些数据,通过递归的方式构建树形结构。


在Java后端中,我们可以通过递归函数来实现这一过程。首先,我们需要定义一个树节点类,该类包含节点的基本信息和一个子节点列表。然后,我们遍历扁平数据列表,对于每一个节点,我们将其加入到对应父节点的子节点列表中。如果当前节点没有子节点,我们可以直接将其加入到树的根节点列表中。然后,我们递归处理当前节点的子节点,直到所有节点都被加入到树中。


通过这种方式,我们可以将扁平的数据列表转换成树形结构,使得数据更加清晰和有序。这样,前端可以利用这棵树来构建下拉菜单等形式的界面,为用户提供更好的体验。代码如下

public static void main(String[] args) {
    // todo 业务数据
    List<TreeVo> treeVoList = new ArrayList<>();

  // 处理父节点为空的情况
    treeVoList
            .stream()
            .filter(obj -> StringUtils.isBlank(obj.getPid()))
            .forEach(obj -> obj.setPid("-1"));

  // 根据父节点分组
    Map<String, List<TreeVo>> treeCatch = treeVoList.stream()
            .collect(Collectors.groupingBy(TreeVo::getPid));

    // 递归查询子节点,写入当前数据
    treeVoList = findChildren(treeCatch, "-1");

    // 打印
    for (TreeVo treeVo : treeVoList) {
        System.out.println(JacksonUtil.bean2json(treeVo));
    }
}

private static List<TreeVo> findChildren(Map<String, List<TreeVo>> treeCatch, String parentId) {
    List<TreeVo> children = treeCatch.getOrDefault(parentId, new ArrayList<>());
    for (TreeVo treeVo : children) {
        List<TreeVo> subChildren = findChildren(treeCatch, treeVo.getId());
        treeVo.getChildren().addAll(subChildren);
    }
    return children;
}



/**
 * 获取场地树RVO
 */
public class TreeVo {

    /**
     * ID
     */
    private String id;

    /**
     * 名称
     */
    private String name;
    
    /**
     * 父ID
     */
    private String pid;

    /**
     * 子级
     */
    private transient List<TreeVo> children;
  
  // 此处省略get\set
}
目录
相关文章
|
6天前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
34 11
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
92 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
24天前
|
XML Java 测试技术
从零开始学 Maven:简化 Java 项目的构建与管理
Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。
36 1
从零开始学 Maven:简化 Java 项目的构建与管理
|
25天前
|
机器学习/深度学习 算法 Python
随机森林算法是一种强大的集成学习方法,通过构建多个决策树并综合其结果进行预测。
随机森林算法是一种强大的集成学习方法,通过构建多个决策树并综合其结果进行预测。本文详细介绍了随机森林的工作原理、性能优势、影响因素及调优方法,并提供了Python实现示例。适用于分类、回归及特征选择等多种应用场景。
49 7
|
1月前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
1月前
|
Java Android开发
Eclipse Java 构建路径
Eclipse Java 构建路径
36 3
|
1月前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
49 2
|
1月前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
51 2
|
27天前
|
JSON 算法 数据挖掘
基于图论算法有向图PageRank与无向图Louvain算法构建指令的方式方法 用于支撑qwen agent中的统计相关组件
利用图序列进行数据解读,主要包括节点序列分析、边序列分析以及结合节点和边序列的综合分析。节点序列分析涉及节点度分析(如入度、出度、度中心性)、节点属性分析(如品牌、价格等属性的分布与聚类)、节点标签分析(如不同标签的分布及标签间的关联)。边序列分析则关注边的权重分析(如关联强度)、边的类型分析(如管理、协作等关系)及路径分析(如最短路径计算)。结合节点和边序列的分析,如子图挖掘和图的动态分析,可以帮助深入理解图的结构和功能。例如,通过子图挖掘可以发现具有特定结构的子图,而图的动态分析则能揭示图随时间的变化趋势。这些分析方法结合使用,能够从多个角度全面解读图谱数据,为决策提供有力支持。
|
2月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
147 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
下一篇
DataWorks