java、js中实现无限层级的树形结构方法(类似递归)

实现无限层级的树形结构可以采用递归的方式。以下是Java和JavaScript各一种实现方法。

Java实现方法

定义树节点类

首先需要定义一个树节点类,用于表示树中的节点。

public class TreeNode {
    private String id;
    private String name;
    private String parentId;
    private List<TreeNode> children;

    // 构造函数
    public TreeNode(String id, String name, String parentId) {
        this.id = id;
        this.name = name;
        this.parentId = parentId;
        this.children = new ArrayList<>();
    }

    // getter和setter方法
}

在这个类中,需要定义节点的id、名称、父节点id和子节点列表。

构建树形结构

有了节点类之后,就可以通过递归构建树形结构了。

public static List<TreeNode> buildTree(List<TreeNode> nodeList, String parentId) {
    List<TreeNode> treeList = new ArrayList<>();

    for (TreeNode node : nodeList) {
        if (parentId.equals(node.getParentId())) {
            List<TreeNode> children = buildTree(nodeList, node.getId());
            node.setChildren(children);
            treeList.add(node);
        }
    }

    return treeList;
}

这个方法接收一个节点列表和一个指定节点id,返回以该节点为根节点的树形结构。它首先遍历节点列表,找到所有父节点id等于指定节点id的节点,然后递归调用自身,获取当前节点的子节点列表,设置到当前节点中,并将当前节点添加到父节点的子节点列表中,最后返回以该节点为根节点的树形结构。

示例

以下是一个示例,创建了一个包含多个节点的节点列表,然后构建以根节点为id的树形结构。

public static void main(String[] args) {
    List<TreeNode> nodeList = new ArrayList<>();
    nodeList.add(new TreeNode("1", "节点1", "0"));
    nodeList.add(new TreeNode("2", "节点2", "0"));
    nodeList.add(new TreeNode("3", "节点3", "1"));
    nodeList.add(new TreeNode("4", "节点4", "1"));
    nodeList.add(new TreeNode("5", "节点5", "2"));
    nodeList.add(new TreeNode("6", "节点6", "3"));
    nodeList.add(new TreeNode("7", "节点7", "4"));
    nodeList.add(new TreeNode("8", "节点8", "4"));
    List<TreeNode> treeList = buildTree(nodeList, "0");
    System.out.println(treeList);
}

输出结果:

[TreeNode{id='1', name='节点1', parentId='0', children=[TreeNode{id='3', name='节点3', parentId='1', children=[TreeNode{id='6', name='节点6', parentId='3', children=[]}]}, TreeNode{id='4', name='节点4', parentId='1', children=[TreeNode{id='7', name='节点7', parentId='4', children=[]}, TreeNode{id='8', name='节点8', parentId='4', children=[]}]}]}, TreeNode{id='2', name='节点2', parentId='0', children=[TreeNode{id='5', name='节点5', parentId='2', children=[]}]}]

JavaScript实现方法

定义树节点类

与Java实现类似,需要先定义一个树节点类。

class TreeNode {
    constructor(id, name, parentId) {
        this.id = id;
        this.name = name;
        this.parentId = parentId;
        this.children = [];
    }
}

构建树形结构

function buildTree(nodeList, parentId) {
    let treeList = [];

    for (let node of nodeList) {
        if (node.parentId === parentId) {
            let children = buildTree(nodeList, node.id);
            node.children = children;
            treeList.push(node);
        }
    }

    return treeList;
}

该函数与Java实现类似,接收一个节点列表和一个指定节点id,返回以该节点为根节点的树形结构。它先遍历节点列表,找到所有父节点id等于指定节点id的节点,然后递归调用自身,获取当前节点的子节点列表,设置到当前节点中,并将当前节点添加到父节点的子节点列表中,最后返回以该节点为根节点的树形结构。

示例

以下是一个示例,创建了一个包含多个节点的节点列表,然后构建以根节点为id的树形结构。

let nodeList = [
    new TreeNode("1", "节点1", "0"),
    new TreeNode("2", "节点2", "0"),
    new TreeNode("3", "节点3", "1"),
    new TreeNode("4", "节点4", "1"),
    new TreeNode("5", "节点5", "2"),
    new TreeNode("6", "节点6", "3"),
    new TreeNode("7", "节点7", "4"),
    new TreeNode("8", "节点8", "4")
];
let treeList = buildTree(nodeList, "0");
console.log(treeList);

输出结果与Java实现相同。

综上所述,实现无限层级的树形结构可以通过递归的方式进行。在Java和JavaScript中都是类似的实现方式。需要定义一个节点类,然后通过一个递归函数构建树形结构,并返回以指定节点id为根节点的树形结构。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java、js中实现无限层级的树形结构方法(类似递归) - Python技术站

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

相关文章

  • windows下安装redis客户端

    Windows下安装Redis客户端 Redis是一个开源内存数据库,也是一个键值存储数据库,它支持多种数据结构类型,并且适合于高速读写的场景。Redis的客户端通常是通过REDIS协议来进行连接的。 本文将介绍如何在Windows系统下安装Redis客户端,并通过命令行使用Redis客户端。 步骤一:下载Redis客户端 在Redis官方下载站(https…

    其他 2023年3月29日
    00
  • 【手把手教你制作ROM】ROM解包、修改、封包工具和教程

    很抱歉,由于ROM制作涉及到一些技术和法律问题,我无法提供关于ROM制作的详细攻略。ROM制作需要深入了解操作系统和相关工具的知识,并且需要遵守相关法律法规。建议你参考官方文档、论坛或专业的ROM制作教程来学习和实践。

    other 2023年10月13日
    00
  • 电脑鼠标右键点击图标闪退桌面重启该怎么办?

    针对“电脑鼠标右键点击图标闪退桌面重启该怎么办?”这个问题,我可以提供以下完整攻略: 第一步:排查是否是软件冲突引起的问题 打开任务管理器,查看是否有正在运行的和占用系统资源较高的软件。 备份电脑中重要数据并卸载可能与出现问题的程序有关的软件。例如,最近刚安装的软件或者最近更新的软件。如果卸载软件后问题解决,则该软件与问题有关。 第二步:尝试修复系统文件 打…

    other 2023年6月27日
    00
  • Android启动页出现白屏、黑屏的解决方案

    对于Android应用程序来说,启动页是用户打开应用程序时的第一个页面,是展示应用程序品牌形象和个性化特点的重要组成部分。然而,很多情况下在应用程序启动时会出现白屏或黑屏的情况,给用户的使用体验带来了不良影响,因此,引起了很多 Android 开发者的关注。下面我们将详细介绍 Android 启动页出现白屏、黑屏的解决方案。 问题的根源 在 Android …

    other 2023年6月26日
    00
  • python中class类与方法的用法实例详解

    Python中class类与方法的用法实例详解 在Python中,我们可以使用class(类)定义一个对象,包括对象的属性和行为,其中方法是类中最重要的组成部分之一。在本文中,我们将详细讲解Python中class类和方法的用法,并提供两个实例,以便更好地理解它们。 什么是类? 类是一种数据类型,它是一个模板或蓝图,用于创建对象的属性和方法。它是一种组合数据…

    other 2023年6月26日
    00
  • umask函数

    umask函数 在UNIX和类UNIX系统中,umask函数是用于设置进程的文件创建权限掩码的函数。当进程创建一个新文件或目录时,文件的权限掩码会应用于该文件,并从文件的权限中减去相应的位。这项技术确保了一个默认的安全级别,以防止新创建的文件对于其他用户或进程可见或访问。 umask的语法和参数 umask函数的语法如下: mode_t umask(mode…

    其他 2023年3月29日
    00
  • Android中常用单位dp,px,sp之间的相互转换

    下面是“Android中常用单位dp,px,sp之间的相互转换的完整攻略”,包括单位的定义、转换公式、两个示例说明等方面。 单位的定义 在Android开发中,常用的单位有dp、px、sp等。以下是这些单位的定义: dp(density-independent pixel):密度无关像素,是一种基于屏幕密度的抽象单位,可以保证在不同屏幕密度的设备上显示相同的…

    other 2023年5月5日
    00
  • Angular5.0.0新特性

    Angular 5.0.0新特性 Angular 5.0.0是由Google发布的一个新版本的Angular,具有许多新特性和功能。在这里我们会详细讲解Angular5的新特性。 新特性 以下是Angular 5.0.0中的一些新特性: HttpClient HttpClient是一个新的模块,它提供了一个现代化的Web API,可以与Json格式的API进…

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