探讨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
}
目录
相关文章
|
13天前
|
消息中间件 存储 Java
使用Java构建可扩展的消息队列系统
使用Java构建可扩展的消息队列系统
|
13天前
|
消息中间件 存储 Java
使用Java构建实时数据处理流程
使用Java构建实时数据处理流程
|
2天前
|
算法 Python
python中算法递归错误(Recursion Errors)
【7月更文挑战第18天】
8 1
|
12天前
|
缓存 算法 安全
Java中的数据结构与算法优化策略
Java中的数据结构与算法优化策略
|
10天前
|
算法 Java
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
21 1
|
12天前
|
缓存 算法 NoSQL
Java中的分布式缓存与一致性哈希算法
Java中的分布式缓存与一致性哈希算法
|
12天前
|
缓存 Java 数据库
使用Java构建可扩展的大规模系统
使用Java构建可扩展的大规模系统
|
12天前
|
存储 算法 Java
Java ZGC 深度剖析及其在构建低延迟流系统中的实践心得
Java ZGC 深度剖析及其在构建低延迟流系统中的实践心得
9 0
Java ZGC 深度剖析及其在构建低延迟流系统中的实践心得
|
13天前
|
消息中间件 Java 微服务
构建可扩展的Java Web应用架构
构建可扩展的Java Web应用架构
|
9天前
|
存储 算法 Java
分布式自增ID算法---雪花算法(SnowFlake)Java实现
分布式自增ID算法---雪花算法(SnowFlake)Java实现