提高树结构访问效率

2024-06-20 14:12
文章标签 访问 效率 提高 树结构

本文主要是介绍提高树结构访问效率,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题


树节点嵌套非常深的时候,想要直接访问某个节点非常困难

需求

  • 修改和查找数据时候不需要 obj.xx.xx.xx.xx这么多层
  • 可以从子节点往上找他的索引父节点

思路

新增辅助数据,用数组替代树结构访问,不修改原来的树结构,这样就可以利用数组的索引查询

针对场景

  • 知道节点2索引,找父节点索引
  • 知道父节点的索引,找父节点数据
  • 知道一个节点的索引,不断的找到它的父节点
  • 知道父索引,遍历找到子索引的所以子节点

代码

树结构
var obj = [{name: "1",index: "0", //辅助调试,真实数据不需要children: [{name: "1-1",index: "1",children: [{name: "1-1-1",index: 2,},{name: "1-1-2",index: 3,},],},{name: "1-2",index: 4,children: [{name: "1-2-1",index: 5,},{name: "1-2-2",index: 6,},],},],},];
新增辅助数据
        //前遍历,存储obj的元素,把obj树节点扁平化const nodelist = [];//从左到右,子节点的索引,数组的索引就是nodelist里面的索引let childrenIndex = [];//从左到右,按照排序,记录对应索引的父节点,数组的索引就是nodelist里面的索引let parentIndex = [];//二维数组 [[],null],存储有子节点的节点的索引,没有的话null,不管层级多深都是二维数组,一维数组的索引就是nodelist里面的索引let indexTree = [];

全部代码

 var obj = [{name: "1",index: "0", //辅助调试,真实数据不需要children: [{name: "1-1",index: "1",children: [{name: "1-1-1",index: 2,},{name: "1-1-2",index: 3,},],},{name: "1-2",index: 4,children: [{name: "1-2-1",index: 5,},{name: "1-2-2",index: 6,},],},],},];//前遍历,存储obj的元素,把obj树节点扁平化const nodelist = [];//从右边到左边,子节点的索引let childrenIndex = [];//从左到右,按照排序,记录对应索引的父节点let parentIndex = [];//二维数组 [[],null],存储有子节点的节点的索引,没有的话nulllet indexTree = [];// parentIndex.push({ pindex: -1, obj: obj })let index = -1;function childrenIdx(obj, pIndex, childrenArr) {for (let i = 0; i < obj.length; i++) {let item = obj[i];index++;let currentIndex = childrenIndex.length;childrenIndex.push({ index: index, currobj: obj[i] });parentIndex.push({ pindex: pIndex, currobj: obj[i] });nodelist.push(item);childrenArr.push(index);if (obj[i].children) {let arr = [];indexTree.push(arr);childrenIdx(obj[i].children, currentIndex, arr);//console.log("index", index, 'item.index', item.index, "i", i)} else {indexTree.push(null);}}}//第一个节点的pindex等于-1childrenIdx(obj, -1, []);console.log("childrenIdxid", childrenIndex, "parentIndex", parentIndex);console.log("nodelist", nodelist);console.log("indexTree,", indexTree);//场景1,知道节点2索引,找父节点索引function getparentIndex(childrenIdx) {return parentIndex[childrenIdx];}//场景2,知道父节点的索引,找父节点数据function getNodeByIndex(index) {return nodelist[index];}let pindexInfo = getparentIndex(2);console.log("2序号节点的父节点",pindexInfo,"父节点数据",getNodeByIndex(pindexInfo.pindex));//场景2,知道一个节点的索引,不断的找到它的父节点let currIndex = 2;function nodeParentList() {let currParentList = [];while (currIndex != -1) {let pindexInfo = getparentIndex(currIndex);let pNode = getNodeByIndex(pindexInfo.pindex);currParentList.push(pNode);currIndex = pindexInfo.pindex;}return currParentList;}console.log("索引为2的node的父节点集合", nodeParentList(2));//场景3,知道父索引,遍历找到子索引的所以子节点let parentIdex = 4; //父节点的索引function getChildrens(index) {let childenIndexs = indexTree[index];console.log("childenIndexs", childenIndexs);if (childenIndexs) {return childenIndexs.map((item) => {return nodelist[item];});}}console.log("父节点下的所有子节点:", getChildrens(parentIdex));</script>

这篇关于提高树结构访问效率的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1078355

相关文章

Java利用@SneakyThrows注解提升异常处理效率详解

《Java利用@SneakyThrows注解提升异常处理效率详解》这篇文章将深度剖析@SneakyThrows的原理,用法,适用场景以及隐藏的陷阱,看看它如何让Java异常处理效率飙升50%,感兴趣的... 目录前言一、检查型异常的“诅咒”:为什么Java开发者讨厌它1.1 检查型异常的痛点1.2 为什么说

通过配置nginx访问服务器静态资源的过程

《通过配置nginx访问服务器静态资源的过程》文章介绍了图片存储路径设置、Nginx服务器配置及通过http://192.168.206.170:8007/a.png访问图片的方法,涵盖图片管理与服务... 目录1.图片存储路径2.nginx配置3.访问图片方式总结1.图片存储路径2.nginx配置

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

NGINX 配置内网访问的实现步骤

《NGINX配置内网访问的实现步骤》本文主要介绍了NGINX配置内网访问的实现步骤,Nginx的geo模块限制域名访问权限,仅允许内网/办公室IP访问,具有一定的参考价值,感兴趣的可以了解一下... 目录需求1. geo 模块配置2. 访问控制判断3. 错误页面配置4. 一个完整的配置参考文档需求我们有一