提高树结构访问效率

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

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

键盘快捷键:提高工作效率与电脑操作的利器

键盘快捷键:提高工作效率与电脑操作的利器 在数字化时代,键盘快捷键成为了提高工作效率和优化电脑操作的重要工具。无论是日常办公、图像编辑、编程开发,还是游戏娱乐,掌握键盘快捷键都能带来极大的便利。本文将详细介绍键盘快捷键的概念、重要性、以及在不同应用场景中的具体应用。 什么是键盘快捷键? 键盘快捷键,也称为热键或快捷键,是指通过按下键盘上的一组键来完成特定命令或操作的方式。这些快捷键通常涉及同

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

如何提高 GitHub 的下载速度

如何提高 GitHub 的下载速度 文章目录 如何提高 GitHub 的下载速度1. 注册账号2. 准备好链接3. 创建仓库4. 在码云上下载代码5. 仓库更新了怎么办 一般来说,国内的朋友从 GitHub 上面下载代码,速度最大是 20KB/s,这种龟速,谁能忍受呢? 本文介绍一种方法——利用“码云”,可以大大提高下载速度,亲测有效。 1. 注册账号 去“码云”注册一

OpenStack中加固VNC访问安全

OpenStack中加固VNC访问安全 目录 OpenStack中加固VNC访问安全1.问题发现2.流程分析3.潜在后果4.解决方案④配置IPtables⑤VNC添加访问密码 5.参考链接 1.问题发现 很多同学使用noVNC之后都没有退出终端的习惯,往往都是用完了就直接关闭网页窗口。说这样隐患很大,如果内网里面有一些script kiddie随时都能将我们线上的虚拟

stl的sort和手写快排的运行效率哪个比较高?

STL的sort必然要比你自己写的快排要快,因为你自己手写一个这么复杂的sort,那就太闲了。STL的sort是尽量让复杂度维持在O(N log N)的,因此就有了各种的Hybrid sort algorithm。 题主你提到的先quicksort到一定深度之后就转为heapsort,这种是introsort。 每种STL实现使用的算法各有不同,GNU Standard C++ Lib

Hbase Filter+Scan 查询效率优化

Hbase Filter+Scan 查询效率问题 众所周知,Hbase利用filter过滤器查询时候会进行全表扫描,查询效率低下,如果没有二级索引,在项目中很多情况需要利用filter,下面针对这种情况尝试了几种优化的方案,仅供参考,欢迎交流。 根据业务要求,作者需要根据时间范围搜索所需要的数据,所以作者设计的rowKey是以时间戳为起始字符串的。 正确尝试: 1.scan 设置 开始行和结

Qt: 详细理解delete与deleteLater (避免访问悬空指针导致程序异常终止)

前言 珍爱生命,远离悬空指针。 正文 delete 立即删除:调用 delete 后,对象会立即被销毁,其内存会立即被释放。调用顺序:对象的析构函数会被立即调用,销毁该对象及其子对象。无事件处理:如果在对象销毁过程中还涉及到信号和槽、事件处理等,直接 delete 可能会导致问题,尤其是在对象正在处理事件时。适用场景:适用于在确定对象已经不再被使用的情况下,并且不涉及异步处理或事件循环中的

如何提高开发的效率,让老板不知所措的给你发工资

设计模式 UML JSP 编程 数据结构 1.你可能会常常发现,写了一段代码后,编译程序时是一大堆的出错 (原因:语法不熟)  ──别担心,这是每个程序员必须经历的事,这时候你就需要更大的耐心及细心,对每一行代码进行仔细人阅读并改正,这个很重要,这可以培养你的理解代码能力,所以要常读程序,不要等到程序运行以后才知道你的程序的结果。  ──如何避免:在写代码以前,要认真的学习计算机语