提高树结构访问效率

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

相关文章

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. 一个完整的配置参考文档需求我们有一

C#实现访问远程硬盘的图文教程

《C#实现访问远程硬盘的图文教程》在现实场景中,我们经常用到远程桌面功能,而在某些场景下,我们需要使用类似的远程硬盘功能,这样能非常方便地操作对方电脑磁盘的目录、以及传送文件,这次我们将给出一个完整的... 目录引言一. 远程硬盘功能展示二. 远程硬盘代码实现1. 底层业务通信实现2. UI 实现三. De

python通过curl实现访问deepseek的API

《python通过curl实现访问deepseek的API》这篇文章主要为大家详细介绍了python如何通过curl实现访问deepseek的API,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编... API申请和充值下面是deepeek的API网站https://platform.deepsee

Nginx 访问 /root/下 403 Forbidden问题解决

《Nginx访问/root/下403Forbidden问题解决》在使用Nginx作为Web服务器时,可能会遇到403Forbidden错误,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录解决 Nginx 访问 /root/test/1.html 403 Forbidden 问题问题复现Ng

使用Dify访问mysql数据库详细代码示例

《使用Dify访问mysql数据库详细代码示例》:本文主要介绍使用Dify访问mysql数据库的相关资料,并详细讲解了如何在本地搭建数据库访问服务,使用ngrok暴露到公网,并创建知识库、数据库访... 1、在本地搭建数据库访问的服务,并使用ngrok暴露到公网。#sql_tools.pyfrom

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使