首页 > 其他分享 >写一个方法,实现树的路径查询[代码]

写一个方法,实现树的路径查询[代码]

时间:2024-12-10 09:12:44浏览次数:3  
标签:Node node treeData 代码 路径 查询 id path 节点

/**
 *  树路径查询函数
 *  @param {Array<Object>} treeData - 树数据,格式为 [{id: 1, name: 'Node 1', children: [...]}, ...]
 *  @param {string | number} targetId - 目标节点的 ID
 *  @returns {Array<Object> | null} - 返回从根节点到目标节点的路径数组,找不到则返回 null
 */
function findPath(treeData, targetId) {
  let path = [];

  function traverse(nodes) {
    if (!nodes || nodes.length === 0) {
      return false;
    }

    for (const node of nodes) {
      path.push(node); // 添加当前节点到路径

      if (node.id === targetId) {
        return true; // 找到目标节点,返回 true
      }

      if (node.children && traverse(node.children)) {
        return true; // 在子节点中找到目标节点,返回 true
      }

      path.pop(); // 回溯,移除当前节点
    }

    return false; // 在当前分支未找到目标节点
  }

  if (traverse(treeData)) {
    return path;
  } else {
    return null;
  }
}


// 示例数据
const treeData = [
  {
    id: 1,
    name: 'Node 1',
    children: [
      { id: 2, name: 'Node 2' },
      {
        id: 3,
        name: 'Node 3',
        children: [
          { id: 4, name: 'Node 4' },
          { id: 5, name: 'Node 5' },
        ],
      },
    ],
  },
  { id: 6, name: 'Node 6' },
];

// 测试用例
console.log(findPath(treeData, 5)); // Output: [{...Node 1}, {...Node 3}, {...Node 5}]
console.log(findPath(treeData, 6)); // Output: [{...Node 6}]
console.log(findPath(treeData, 7)); // Output: null
console.log(findPath(treeData, 1)); // Output: [{...Node 1}]


代码解释:

  1. findPath(treeData, targetId) 函数:

    • 接受树数据 treeData 和目标节点 ID targetId 作为参数。
    • 初始化一个空数组 path 用于存储路径。
    • 调用 traverse 函数进行深度优先搜索。
    • 如果 traverse 返回 true(找到目标节点),则返回 path;否则返回 null
  2. traverse(nodes) 函数:

    • 接受当前层级节点数组 nodes 作为参数。
    • 遍历 nodes 中的每个节点:
      • 将当前节点 node 推入 path 数组。
      • 如果 node.id 等于 targetId,则找到目标节点,返回 true
      • 如果 node 存在子节点 children,则递归调用 traverse(node.children)。如果子节点中找到目标节点,则返回 true
      • 如果在当前节点及其子节点中都未找到目标节点,则从 path 数组中弹出当前节点(回溯)。
    • 如果遍历完所有节点都未找到目标节点,则返回 false

关键点:

  • 深度优先搜索 (DFS): 使用递归实现深度优先搜索,遍历树的每个分支。
  • 回溯: 在遍历完一个分支后,使用 path.pop() 将当前节点从路径中移除,以便继续搜索其他分支。
  • 清晰的返回值: traverse 函数返回 truefalse,表示是否找到目标节点,简化了逻辑。

这个改进版本更加简洁,逻辑清晰,并且包含了测试用例,方便理解和使用。 它能正确处理各种情况,包括目标节点在根节点、叶子节点或中间节点的情况,以及目标节点不存在的情况。

标签:Node,node,treeData,代码,路径,查询,id,path,节点
From: https://www.cnblogs.com/ai888/p/18596517

相关文章

  • 上市公司供需波动、供需长鞭效应数据+代码(2007-2022年)
    企业供需波动指的是在市场经济中,企业所提供的商品或服务的供给量与消费者对该商品或服务的需求量之间所出现的动态变化。这种变化直接反映了市场供需关系的平衡状态,以及企业运营和市场环境的不确定性。了解和预测供需波动的情况,有助于制定更合理的生产计划和市场营销策略,以应对......
  • Microi吾码:开源低代码,微服务开发的利器
    前言在微服务架构的应用中,服务的灵活性和可扩展性至关重要。Microi吾码作为一个高效的微服务框架,凭借其轻量级、可插拔的特性,已经成为开发者构建分布式应用的首选工具。除了基础的微服务开发功能外,Microi吾码还提供了丰富的扩展功能,其中表单引擎是一个重要亮点。本篇博客......
  • (全新整理)企业层面出口产品质量:原始数据+代码+测算结果(2000-2016年)
    文章目录数据下载地址数据指标说明项目备注数据下载地址数据下载地址点击这里下载数据数据指标说明目前国内对出口产品质量的测算有多种方法,目前整理目前引用比较高的施炳展等、张杰等的2种方法。原始数据是2000至2016的海关数据库,数据质量非常高,测算了2000-20......
  • 昇腾920B2成功运行bge-large-zh-v1.5后(text embeddings inference方式,也被称为TEI),如何
    文章目录引言什么是bge-large-zh-v1.5?在昇腾920B2上运行bge-large-zh-v1.5编写fastapi服务,将TEI转化成兼容OpenAI的方式将模型注册到dify结论引言在上一篇中,我们抱着侥幸的,试一试的心态,竟然真的用昇腾显卡跑通了用于embedding的bge-large-zh-v1.5......
  • JavaUtils - [04] 代码生成器(新)
    题记部分  001|| 引入依赖<!--CodeGenerator--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.9</version></dependency><depend......
  • JavaUtils - [03] 代码生成器
    题记部分 001|| 引入依赖<!--CodeGenerator--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.4.1</version></dependency><dependenc......
  • 解决CSDN不登录就不能复制代码的问题
    1、在书签栏加一个书签2、在网址输入框中填入如下代码3、以后每次想要复制之前点击一下这个书签,就可以自由复制CSDN的代码啦 javascript:window.oncontextmenu=document.oncontextmenu=document.oncopy=null;[...document.querySelectorAll('body')].forEach(dom=>dom.oute......
  • java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
    @目录java实现下载hdfs文件及文件夹说明:java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下1.下载xxx文件2.下载xx文件夹java实现下载hdfs文件及文件夹说明:java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下<!......
  • 技术框架中对高级查询一对多查询的学习
    高级查询之一对多查询查询条件根据游戏名称,查询游戏账号信息我们在之前创建的映射器接口GameMapper.java中添加接口方法,如下: /***根据游戏名查询游戏账号*@paramname游戏名*@return游戏实体类*/publicGameEntityselectGameByName(Str......
  • Torch-TensorRT针对 NVIDIA GPU 的 PyTorch 推理代码的框架内编译In-framework compil
    Torch-TensorRT针对NVIDIAGPU的PyTorch推理代码的框架内编译Torch-TensorRT是PyTorch的推理编译器,通过NVIDIA的TensorRT深度学习优化器和运行时针对NVIDIAGPU。它通过接口支持即时(JIT)编译工作流程torch.compile,也支持提前(AOT)工作流程。Torch-TensorRT......