当前位置: 首页 > backend >正文

记录下递归

在树形结构中,已知目标对象的值,可以通过递归或迭代的方式找到其所有父级对象。以下是一个基于递归的方法,通过 id 查找目标对象的所有父级对象。
主要记录下之前写代码的不好习惯----如果是想利用递归函数返回对应的数据,那么要接收每个递归函数的返回值,否则深层递归的值将获取不到

示例代码

数据结构

假设你的树形结构数据如下:

const treeData = [{id: 1,name: '父节点1',children: [{id: 11,name: '子节点1-1',children: [{ id: 111, name: '子节点1-1-1', parentId: 11 },],parentId: 1,},],},{id: 2,name: '父节点2',children: [{ id: 21, name: '子节点2-1', parentId: 2 },],},
];
方法:递归查找父级对象

以下是一个递归函数,用于查找目标对象的所有父级对象:

function findParentNodes(tree, targetId) {let result = [];// 遍历当前层级的节点for (const node of tree) {if (node.id === targetId) {// 如果找到目标节点,返回结果return result;}if (node.children && node.children.length > 0) {// 递归查找子节点const foundNodes = findParentNodes(node.children, targetId);if (foundNodes) {// 如果在子节点中找到目标节点,将当前节点添加到结果中result = [...foundNodes, node];return result;}}}// 如果当前层级未找到目标节点,返回 nullreturn null;
}// 示例:查找目标节点的所有父级
const targetId = 111; // 目标节点的 ID
const parentNodes = findParentNodes(treeData, targetId);if (parentNodes) {console.log('父级节点:', parentNodes);
} else {console.log('未找到目标节点');
}

代码说明

  1. 递归函数

    • findParentNodes 是一个递归函数,它接受三个参数:
      • tree:当前层级的树形数据。
      • targetId:目标节点的 ID。
  2. 遍历当前层级

    • 遍历当前层级的节点,检查每个节点的 id 是否与目标 ID 匹配。
  3. 递归查找子节点

    • 如果当前节点有子节点(children),递归调用 findParentNodes 函数,查找子节点中的目标节点。
  4. 返回结果

    • 如果在子节点中找到目标节点,将当前节点添加到结果数组中,并返回结果。
    • 如果当前层级未找到目标节点,返回 null
  5. 调用示例

    • 调用 findParentNodes 函数,传入树形数据和目标节点的 ID。
    • 如果找到目标节点的父级节点,打印结果;否则,打印未找到提示。

输出结果

假设目标节点的 ID 是 111,输出结果如下:

父级节点: [{ id: 11, name: '子节点1-1', parentId: 1 },{ id: 1, name: '父节点1' }
]

注意事项

  • 确保树形结构数据中包含 children 字段。
  • 如果树形结构较深,递归调用可能会导致性能问题。在这种情况下,可以考虑使用迭代方法(如栈或队列)来实现。
  • 如果目标节点不存在于树形结构中,函数会返回 null

通过上述方法,可以高效地找到目标节点的所有父级对象。

http://www.xdnf.cn/news/1494.html

相关文章:

  • 0.(新专栏目录)数据分类的艺术:从理论到实践的全面指南
  • 结构型模式:适配器模式
  • java后端开发day35--集合进阶(四)--双列集合:MapHashMapTreeMap
  • leetcode 二分查找应用
  • Linux/AndroidOS中进程间的通信线程间的同步 - IPC方式简介
  • Podman Desktop:现代轻量容器管理利器(Podman与Docker)
  • 基于stm32的智能门锁系统
  • ecovadis评估注意事项?ecovadis评估过程需要多长时间
  • gem5-gpu教程05 内存建模
  • 46. 全排列
  • Prisma JSON存储扩展性
  • 1.6软考系统架构设计师:架构师的角色与能力要求 - 练习题附答案及超详细解析
  • OpenCV图像轮廓示例
  • 如何创建GitLab 合并请求?
  • 【每日八股】复习 MySQL Day2:索引
  • 【Java面试笔记:基础】10.如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?
  • 前缀和相似题共赏
  • 文件自动备份
  • 共建安全可控大模型AI底座,助力国产化升级——麒麟信安与新智惠想达成战略合作
  • 2025.04.23华为机考第一题-100分
  • Redis高频核心面试题
  • go中redis使用的简单介绍
  • 利用HandlerMethodArgumentResolver和注解解析封装用户信息和Http参数
  • Postman设置了Cookies但是请求不携带Cookie
  • Java | 深拷贝与浅拷贝工具类解析和自定义实现
  • 今日行情明日机会——20250423
  • 协程gevent案例
  • 从代码学习深度学习 - 自动并行 PyTorch 版
  • AI飞行行为的可解释性与合规审计机制设计
  • React SSR + Redux 导致的 Hydration 报错踩坑记录与修复方案