news 2026/8/23 19:47:16

树形结构遍历与递归应用解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
树形结构遍历与递归应用解析

一、核心知识点概述

本案例通过递归算法实现树形结构的遍历,主要涉及以下知识点:

  1. 树形结构的递归遍历
  2. Set数据结构的去重特性
  3. 层级结果的合并逻辑
  4. 条件判断与递归终止条件

二、递归实现原理分析

举个例子
基础数据

const mockData = [{id: 1, labe: '父节点1', children: [{id:11,label:'子节点1',},{id:12,label:'子节点2',},{id:13,label:'子节点3',},],},{id: 2, labe: '父节点2', children: [{id:21,label:'子节点1',},{id:22,label:'子节点2',},{id:23,label:'子节点3',},],},{id: 3, labe: '父节点3', children: [{id: 31, label: '子节点1', children: [{id:311,label:'子节点1.1',},{id:312,label:'子节点1.2',},{id:313,label:'子节点1.3',},],},{id:32,label:'子节点2',},{id:33,label:'子节点3',},],},];
const selectKey = [1,11,12,22];

需求:根据给定选中的节点id值,自动填充其父级在节点id

1. 递归函数结构

constcollectAllParents=(nodes,checkedKeys)=>{constresult=newSet();nodes.forEach(item=>{// 基础判断:当前节点是否被选中if(checkedKeys.has(item.id))result.add(item.id);// 递归处理子节点if(item?.children?.length>0){constsubResult=collectAllParents(item.children,checkedKeys);// 合并子结果与当前节点if(subResult.size>0){result.add(item.id);// 父节点自动选中subResult.forEach(id=>result.add(id));}}});returnresult;};

2. 递归终止条件

  • 当节点无子节点(item.children.length === 0)时,递归自然终止
  • 当遍历完所有子节点后,返回当前层级的结果集

3. 递归执行流程

  1. 从根节点开始遍历
  2. 检查当前节点是否被选中
  3. 若存在子节点,递归处理子节点集合
  4. 合并子节点结果与当前节点结果
  5. 返回包含当前层级及子层级结果的集合

三、Set数据结构的作用

1. 去重特性

constcheckedKeys=newSet(selectKey);
  • 确保遍历过程中节点ID的唯一性
  • 提供O(1)时间复杂度的成员判断(has()方法)

2. 结果集的合并

subResult.forEach(id=>result.add(id));
  • 利用Set的自动去重特性合并多级结果
  • 避免手动去重的复杂性

四、层级结果合并机制

1. 父子节点关联逻辑

当子节点被选中时:

if(subResult.size>0){result.add(item.id);// 自动选中父节点// 合并子节点结果}
  • 父节点自动被标记为选中
  • 子结果集通过forEach合并到父级结果

2. 多层级数据穿透

// 从根节点到最深层子节点的递归穿透constsubResult=collectAllParents(item.children,checkedKeys);
  • 实现自底向上的结果收集
  • 确保所有父节点都被正确标记

五、条件判断逻辑

1. 当前节点选中判断

if(checkedKeys.has(item.id))result.add(item.id);
  • 直接判断当前节点是否在选中列表

2. 子节点结果判断

if(subResult.size>0){...}
  • 通过子结果集的大小判断是否存在被选中的子节点

六、 核心知识点

递归遍历每层涉及的变量值是相互独立的,在每一层收集之后进行合并整合

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/19 17:30:37

雷科电力-REKE-30kVA-10kV-5kV工频耐压试验装置

一、概述:雷科电力生产的REKE-30kVA/10kV/5kV智能工频耐压试验系统,该控制系统具有操作便捷,性能优使用安全可靠、外形美观、耐用、移动方便等特点。是供电企业、大型电力企业、冶金、发电厂、铁路等需要电力维修部门的常用的设备。本产品采用…

作者头像 李华
网站建设 2026/8/23 9:00:58

VPS和轻量云服务器哪个更适合手游CPS?

对于手游CPS(Cost Per Sale,按销售计费)推广业务而言,轻量云服务器(Lightweight Cloud Server)通常是比传统VPS更优的选择。以下是基于手游CPS业务场景(如搭建落地页、跑量测试、挂脚本等&#…

作者头像 李华
网站建设 2026/8/22 0:28:32

Mem Reduct官网下载安装保姆级教程(附最新版安装包,非常详细)

Mem Reduct 是一款只有 300 KB 左右的绿色内存优化软件,完全免费,功能强大,操作简单易用,拥有十分出众的内存清理功能。 Mem Reduct 把复杂的技术藏在极简界面里,双击即可清理内存,内存占用率瞬间掉下去&a…

作者头像 李华
网站建设 2026/8/21 13:37:24

Day37 深入理解SHAP图

SHAP值的解读 对于信贷问题,我们除了希望知道是否存在风险,还希望知道每个特征贡献了多少,比如年收入0.15,收入高,加分;负债率-0.30负债太高,减分;工作年限0.05工作稳定,小加分;信用评分-0.25 …

作者头像 李华
网站建设 2026/8/23 11:07:48

Linux内核参数调优提升Qwen3-32B并发处理能力

Linux内核参数调优提升Qwen3-32B并发处理能力 在企业级AI服务日益依赖大语言模型的今天,一个常见的现实是:即便部署了像Qwen3-32B这样性能强劲的320亿参数模型,实际推理吞吐和响应延迟仍可能远低于预期。问题往往不在于模型本身或GPU算力不足…

作者头像 李华
网站建设 2026/8/22 22:46:41

Java开发者必看:用Seed-Coder-8B-Base提升Spring项目编码速度

Java开发者必看:用Seed-Coder-8B-Base提升Spring项目编码速度 在现代企业级开发中,Java 依然是构建高可用、可扩展后端服务的首选语言。尤其是在 Spring Boot 和 Spring Cloud 构成的微服务生态下,项目的迭代速度直接决定了产品上线节奏。然而…

作者头像 李华