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

yizhihongxing

实现无限层级的树形结构可以采用递归的方式。以下是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日

相关文章

  • 浅谈ElementUI el-select 数据过多解决办法

    首先我们来分析一下问题:当el-select中的选项数据过多时,会造成界面卡顿、渲染缓慢等问题,影响用户体验。如何缓解这个问题,提高el-select的渲染效率呢? 经过研究和实践,我们找到了以下两种解决方案: 解决方案一:懒加载 懒加载是一种常见的优化策略,也可以应用到el-select的优化中。我们可以将所有的选项数据分批异步加载,只加载当前上下文中可见…

    other 2023年6月27日
    00
  • 一加手机开发者选项在哪里 一加手机如何开启USB调试功能

    一加手机开发者选项在哪里? 在一加手机上,开发者选项默认是隐藏的,需要按照以下步骤进行开启: 打开“设置”应用,向下滑动直到找到“关于手机”选项。 在“关于手机”页面中,找到“版本号”一项。 点击“版本号”一项连续7次,系统会提示您已成功开启开发者选项。 一加手机如何开启USB调试功能? 在开启了开发者选项后,您可以按照以下步骤开启USB调试功能: 打开“设…

    other 2023年6月26日
    00
  • Java基础之方法重写详解

    Java 基础之方法重写详解 什么是方法重写? 在 Java 中,方法重写是指子类中定义了和父类中方法名称、参数列表以及返回值类型均相同的一个方法,并且该子类中这个方法的访问权限要大于等于父类中此方法的访问权限。当调用该方法时,子类对象会优先执行自身中的方法,而不是执行父类中的同名方法。 方法重写的注意事项 在进行方法重写的时候,需要注意以下几点: 方法名称…

    other 2023年6月26日
    00
  • java应用开发之JVM运行时内存分析

    Java应用开发之JVM运行时内存分析攻略 在Java应用开发中,JVM(Java虚拟机)运行时内存分析是一项重要的技能。通过对JVM运行时内存的分析,我们可以了解应用程序的内存使用情况,发现潜在的内存泄漏问题,并进行性能优化。下面是一份详细的攻略,帮助你进行JVM运行时内存分析。 1. 使用工具 在进行JVM运行时内存分析之前,我们需要使用一些工具来帮助我…

    other 2023年8月2日
    00
  • C++深入探究重载重写覆盖的区别

    C++深入探究重载、重写、覆盖的区别 在C++中,有三种不同的函数使用方法:重载(Overloading)、重写(Overriding)和覆盖(Hiding)。虽然它们有些相似之处,但它们各自有不同的用途和行为。以下是它们的详细解释。 重载(Overloading) 重载是指定义多个具有相同名称(函数名)但不同参数列表(参数类型、参数个数或参数顺序)的函数。…

    other 2023年6月26日
    00
  • keil5最新破解教程(可以使用到2032年哦!):

    Keil5最新破解教程(可以使用到2032年哦!) Keil5是一款以ARM Cortex-M为基础的嵌入式系统开发工具,由Keil Software发布。然而,它是一个商业软件,需要付费才能使用。但是,我们可以通过这篇文章介绍的方法进行破解,让你能够免费且长期地使用它。 步骤一:下载Keil5软件和破解文件 首先,我们需要下载Keil5软件和破解文件。你可…

    其他 2023年3月28日
    00
  • Android 图片存储到指定路径和相册的方法

    下面是关于“Android 图片存储到指定路径和相册的方法”的完整攻略。 1. 存储到指定路径 在 Android 中,我们可以通过使用 File 类库来创建一个指定路径的文件夹。然后,我们可以将图片保存在该文件夹中。 以下是一些示例代码: 1.1 创建目录和文件 String folderPath = Environment.getExternalStor…

    other 2023年6月26日
    00
  • 魔兽世界6.2冰DK属性选择及输出手法详解

    魔兽世界6.2 冰冷死亡骑士属性选择及输出手法详解攻略 1. 介绍 本篇攻略主要针对魔兽世界6.2版本中,冰冷死亡骑士的属性选择和输出手法进行详细讲解。旨在帮助读者更好地了解该职业的基本操作和优化方法。 2. 属性选择 2.1. 基本属性 在选择属性时,冰冷死亡骑士最重要的属性是力量和全能。力量可以提高伤害输出和技能强度,而全能则可以提高暴击和多重打击。其他…

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