Java利用递归实现树形结构的工具类

Java利用递归实现树形结构的工具类攻略

简述

树形结构在程序中非常常见,而递归是树形结构处理最基本的方法。因此,利用递归实现树形结构的工具类也是非常有用的。

本攻略将介绍如何使用Java语言利用递归实现树形结构的工具类,包括实现方法及其应用。

实现方法

以下为Java实现树形结构的工具类的核心代码:

public class TreeUtil {
    /**
     * 将列表转化为树形结构
     *
     * @param list 列表数据
     * @param pid  父节点ID
     * @return 树形结构数据
     */
    public static <T extends TreeNode<T>> List<T> buildTree(List<T> list, Object pid) {
        List<T> trees = new ArrayList<>();
        list.forEach(t -> {
            if (pid.equals(t.getParentId())) {
                trees.add(findChildren(t, list));
            }
        });
        return trees;
    }

    /**
     * 递归查找子节点
     *
     * @param tree 节点
     * @param list 列表数据
     * @return 树形结构的节点
     */
    public static <T extends TreeNode<T>> T findChildren(T tree, List<T> list) {
        list.forEach(t -> {
            if (tree.getId().equals(t.getParentId())) {
                if (tree.getChildren() == null) {
                    tree.setChildren(new ArrayList<>());
                }
                tree.getChildren().add(findChildren(t, list));
            }
        });
        return tree;
    }
}

TreeNode是节点的实体类,具体实现如下:

public class TreeNode<T> {
    private Object id;
    private Object parentId;
    private List<T> children;

    // Getters and Setters
}

如上所述,该工具类主要包含以下两个方法:

  1. buildTree:将列表转化为树形结构;
  2. findChildren:递归查找子节点。

其中,buildTree方法的具体实现为:

  • 遍历列表,如果某个节点的ParentId等于传入的pid,则将该节点及其所有子节点加入到树形结构中。

findChildren方法的具体实现为:

  • 遍历列表,如果某个节点的ParentId等于传入的节点的id,则递归查找该节点的子节点,并将该节点及其所有子节点加入到树形结构中。

应用示例

这里给出两个树形结构操作的示例:

  1. 给出如下的树形结构:
[
    {"id": 1, "parentId": null},
    {"id": 2, "parentId": 1},
    {"id": 3, "parentId": 2},
    {"id": 5, "parentId": 1}
]

使用TreeUtil工具类将其转化为树形结构:

public class Test {
    public static void main(String[] args) {
        List<TreeNode> treeNodeList = new ArrayList<>();
        treeNodeList.add(new TreeNode(1L, null));
        treeNodeList.add(new TreeNode(2L, 1L));
        treeNodeList.add(new TreeNode(3L, 2L));
        treeNodeList.add(new TreeNode(5L, 1L));
        List<TreeNode> treeList = TreeUtil.buildTree(treeNodeList, null);
        System.out.println(JSON.toJSONString(treeList));
    }
}

转化后的树形结构:

[
    {
        "id": 1,
        "parentId": null,
        "children": [
            {
                "id": 2,
                "parentId": 1,
                "children": [
                    {
                        "id": 3,
                        "parentId": 2,
                        "children": []
                    }
                ]
            },
            {
                "id": 5,
                "parentId": 1,
                "children": []
            }
        ]
    }
]
  1. 给出如下的树形结构:
[
    {"id": 1, "parentId": null},
    {"id": 2, "parentId": 1},
    {"id": 3, "parentId": 2},
    {"id": 5, "parentId": 1},
    {"id": 7, "parentId": 8},
    {"id": 8, "parentId": null}
]

使用TreeUtil工具类查找id为2的节点的所有子节点:

public class Test {
    public static void main(String[] args) {
        List<TreeNode> treeNodeList = new ArrayList<>();
        treeNodeList.add(new TreeNode(1L, null));
        treeNodeList.add(new TreeNode(2L, 1L));
        treeNodeList.add(new TreeNode(3L, 2L));
        treeNodeList.add(new TreeNode(5L, 1L));
        treeNodeList.add(new TreeNode(7L, 8L));
        treeNodeList.add(new TreeNode(8L, null));
        TreeNode node = new TreeNode(2L, 1L);
        TreeNode result = TreeUtil.findChildren(node, treeNodeList);
        System.out.println(JSON.toJSONString(result.getChildren()));
    }
}

查找后的结果:

[
    {
        "id": 3,
        "parentId": 2,
        "children": []
    }
]

总结

通过上述介绍,我们可以看到,使用Java语言利用递归实现树形结构的工具类可以大大方便我们对树形数据的处理。通过TreeUtil工具类的两个核心方法,我们可以将列表数据转化为树形结构,也可以实现根据指定节点查找子节点的操作,极大地方便了程序开发。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java利用递归实现树形结构的工具类 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • AJAX显示加载中并弹出图层遮挡页面的实现示例

    这里就为你详细讲解一下“AJAX显示加载中并弹出图层遮挡页面的实现示例”的完整攻略。 显示加载中 在前端页面中,我们可以通过动态添加HTML和CSS来实现一个加载中的提示框,其中HTML部分可以用如下代码: <div class="loading-overlay"> <div class="loading-ic…

    other 2023年6月25日
    00
  • Java实现线性表的链式存储

    实现线性表的链式存储是Java编程中常见的操作之一,下面是完整的攻略: 什么是线性表的链式存储 线性表的链式存储指的是将线性表中的每个元素用一个结点来表示,并将结点之间通过指针链接起来,形成一条“链”的存储结构。每个结点包含两部分信息:数据域和指针域。其中,数据域用来存储具体的元素信息,指针域则用来保存下一个结点的地址。 线性表的链式存储实现步骤 定义结点类…

    other 2023年6月28日
    00
  • Shell脚本中$符号的几种用法小结

    Shell脚本中$符号的几种用法小结 在Shell脚本中,$符号有多种用法,用于引用变量、特殊变量和命令替换。下面是$符号的几种常见用法的详细说明: 1. 引用变量 在Shell脚本中,$符号用于引用变量的值。当使用$符号引用变量时,Shell会将其替换为变量的实际值。以下是一些示例: name=\"John\" echo \"…

    other 2023年8月5日
    00
  • 搬瓦工服务器搭建vpn

    以下是“搬瓦工服务器搭建VPN的完整攻略”的详细讲解,过程中包含两个示例说明的标准Markdown格式文本: 搬瓦工服务器搭建VPN的完整攻略 在搬瓦工服务器上搭建VPN可以帮助我们实现网络加密和匿名访问的功能。本文将介绍如何在搬瓦工服务器上搭建VPN,并提供两个常用的示例。 1. 选择VPN协议 在搭建VPN之前,我们需要选择合适的VPN协议。常用的VPN…

    other 2023年5月10日
    00
  • 百度云管家没有保存任何文件却占内存该怎么办?

    百度云管家没有保存任何文件却占用内存的解决攻略 如果百度云管家没有保存任何文件却占用了内存,可能是由于缓存或其他问题导致的。下面是解决这个问题的完整攻略: 步骤一:清理缓存 打开百度云管家应用。 在应用界面中,找到设置选项。 进入设置选项后,查找并选择“清理缓存”功能。 点击“清理缓存”按钮,等待清理过程完成。 示例说明1:清理缓存 假设你的百度云管家应用占…

    other 2023年8月2日
    00
  • 智联招聘忘记用户名和密码了怎么办?

    智联招聘忘记用户名和密码了怎么办? 在使用智联招聘过程中,有时会因为忘记用户名和密码而无法登录账号。下面提供两种方法来找回智联招聘账号: 方法一:通过注册邮箱找回 打开智联招聘登录界面:www.zhaopin.com。 点击右上角“登录”按钮,进入登录界面。 点击“忘记密码”,进入密码找回页面。 选择“用邮箱找回账号”选项,输入用户注册时填写的邮箱地址,并完…

    other 2023年6月27日
    00
  • Python函数递归调用实现原理实例解析

    Python函数递归调用实现原理实例解析 什么是函数递归调用? 函数递归调用是指在函数内部调用自己的一种方法。通过递归调用,可以将一个大问题分解成多个子问题,然后递归地解决每个子问题,最后将结果合并起来,得到最终的答案。 递归调用的实现原理 递归调用的实现原理是基于函数调用栈的。每次函数调用都会在栈上分配一段内存空间,用于存储函数的参数、局部变量、返回地址等…

    other 2023年6月27日
    00
  • php获取访问者IP地址汇总

    PHP获取访问者IP地址汇总攻略 在PHP中,获取访问者的IP地址可以通过多种方式实现。下面是一个完整的攻略,包含了两个示例说明。 方法一:使用$_SERVER全局变量 PHP中的$_SERVER全局变量包含了与服务器相关的信息,其中包括访问者的IP地址。通过访问$_SERVER[‘REMOTE_ADDR’]可以获取到访问者的IP地址。 示例代码: $ip …

    other 2023年7月30日
    00
合作推广
合作推广
分享本页
返回顶部