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日

相关文章

  • Linux系统交换空间介绍

    Linux系统交换空间介绍 什么是交换空间? 交换空间(Swap Space)是Linux系统中的一部分磁盘空间,用于存储内存中暂时不活跃的进程或页面。当系统的物理内存不足时,操作系统会将一些不常用的内存页面转移到交换空间中,以释放物理内存供其他进程使用。 为什么需要交换空间? 交换空间的存在有以下几个原因: 扩展可用内存:交换空间可以扩展系统的可用内存。当…

    other 2023年8月2日
    00
  • 完美的Socks代理解决方案

    完美的Socks代理解决方案 Socks代理是一个网络协议,可以用来将所有传输的数据通过代理服务器进行转发。使用Socks代理可以绕过一些网络限制,保护用户隐私,加速网络传输等。 选择一款Socks代理软件 首先需要选择一款可靠的Socks代理软件。推荐使用 Shadowsocks。Shadowsocks是一款开源的跨平台软件,具有高速、安全、稳定的特点。可…

    other 2023年6月26日
    00
  • C/C++中的内存管理小结

    C/C++中的内存管理小结 内存管理是C/C++编程中非常重要的一部分,它涉及到动态内存分配、释放和管理。正确的内存管理可以提高程序的性能和稳定性。本文将详细讲解C/C++中的内存管理,并提供两个示例说明。 1. 静态内存分配 静态内存分配是指在编译时为变量分配内存空间,这些变量的生命周期与程序的生命周期相同。静态内存分配由编译器自动完成,无需手动管理。 示…

    other 2023年8月1日
    00
  • Android滑动冲突的完美解决方案

    好的。首先,让我们分析一下什么是Android滑动冲突以及它的原因。Android滑动冲突通常指的是多个滑动控件的滑动事件发生冲突的情况。例如,在一个嵌套的布局中,里面的滑动控件与外面的滑动控件同时滑动时会产生冲突。这种冲突的出现是由于每个控件都有自己的滑动事件处理机制,因此,当它们同时出现时就会发生冲突。那么,我们该如何解决这种冲突呢? 下面是解决Andr…

    other 2023年6月26日
    00
  • 浅谈Mysql使用B+树来实现索引的原因

    以下是详细讲解“浅谈Mysql使用B+树来实现索引的原因”的攻略。 背景与介绍 Mysql是一种常用的关系型数据库管理系统,提供了多种索引方式来优化查询操作。其中,使用B+树实现索引是一种常用的方式。本篇攻略将会深入浅出地探讨Mysql使用B+树来实现索引的原因。 什么是B+树? B+树是一种数据结构,它可以被用来实现索引,使得查找、插入和删除的时间复杂度都…

    other 2023年6月27日
    00
  • Netty分布式Server启动流程服务端初始化源码分析

    Netty分布式Server启动流程服务端初始化源码分析 概述 Netty是一个高性能的基于Java NIO的网络编程框架,可以实现异步的、事件驱动的网络应用程序。 本文将对Netty分布式Server启动流程的服务端初始化源码进行详细分析,从源码实现的角度解析Netty分布式Server启动流程,并提供两个具体的示例来说明。 Netty分布式Server启…

    other 2023年6月20日
    00
  • python-使用conda安装opencv

    以下是关于“Python使用conda安装OpenCV”的完整攻略,包括基本概念、步骤和两个示例。 基本概念 OpenCV是一个开源的计算机视觉库,可用于处理图像和视频。conda是一个流行的Python包管理器,可用于安装和管理Python及其依赖项。 步骤 以下是使用conda安装OpenCV的步骤: 安装conda:在安装OpenCV之前,需要安装co…

    other 2023年5月7日
    00
  • 浅析Nginx配置文件中的变量的编写使用

    浅析Nginx配置文件中的变量的编写使用 Nginx是一个高性能的Web服务器和反向代理服务器,它的配置文件中可以使用变量来实现动态的配置。本文将详细讲解Nginx配置文件中的变量的编写和使用方法,并提供两个示例说明。 变量的定义和使用 在Nginx配置文件中,可以使用set指令来定义变量,并使用$符号来引用变量。变量的命名规则与其他编程语言类似,可以包含字…

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