Java中递归构建树形结构的算法解读

 更新时间:2025年03月04日 08:48:50   作者:微笑听雨。  
该文章介绍了如何使用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
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot 定时任务遇到的坑

    SpringBoot 定时任务遇到的坑

    这篇文章主要介绍了SpringBoot 定时任务遇到的坑,今天踩的这个坑和 cron 表达式有关,文中给大家介绍了cron 表达式的解释,需要的朋友一起看看吧
    2017-11-11
  • 解析JPA的视图查询问题

    解析JPA的视图查询问题

    这篇文章主要是对JPA的视图查询问题进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-12-12
  • 浅析Java中如何处理接口返回的JSON数据

    浅析Java中如何处理接口返回的JSON数据

    在 Java 里处理接口返回的 JSON,最常用的是 Jackson 或 Gson 这两个库,下面小编将用最简单,最实用的方式教你,快跟随小编一起学习一下吧
    2026-04-04
  • SpringBoot实现文件上传下载的7种方法

    SpringBoot实现文件上传下载的7种方法

    文件上传下载功能是Web应用中的常见需求,从简单的用户头像上传到大型文件的传输与共享,都需要可靠的文件处理机制,下面我们来看看SpringBoot中处理文件上传下载的7种方法吧
    2025-05-05
  • springboot项目中整合高德地图的实践

    springboot项目中整合高德地图的实践

    这篇文章主要介绍了springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • springboot利用redis、Redisson处理并发问题的操作

    springboot利用redis、Redisson处理并发问题的操作

    这篇文章主要介绍了springboot利用redis、Redisson处理并发问题的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • java使用内存数据库ssdb的步骤

    java使用内存数据库ssdb的步骤

    这篇文章主要介绍了java使用内存数据库ssdb的步骤,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-12-12
  • dom4j创建和解析xml文档的实现方法

    dom4j创建和解析xml文档的实现方法

    下面小编就为大家带来一篇dom4j创建和解析xml文档的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Guava中这些Map技巧可以让代码量减少了50%

    Guava中这些Map技巧可以让代码量减少了50%

    guava提供了非常强大的操作,可以让我们把java代码写的很简洁,下面这篇文章主要给大家介绍了关于Guava中这些Map使用技巧可以让代码量减少了50%的相关资料,需要的朋友可以参考下
    2022-11-11
  • java实现简单的加减乘除计算器

    java实现简单的加减乘除计算器

    这篇文章主要为大家详细介绍了java实现简单的加减乘除计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09

最新评论