手机版

javascript数据结构多树的经典操作示例[创建、添加、遍历、移除等 ]

时间:2021-08-30 来源:互联网 编辑:宝哥软件园 浏览:

本文举例说明了javascript数据结构多树的经典操作。分享给大家参考,如下:

多树可以实现复杂数据结构的存储,通过遍历的方式查找数据方便高效,提高了查找效率,方便了节点数据的管理。事实上,javascript的DOM是以多分支树的形式存储的。下面用javascript实现多树的数据结构

1.创建节点

数据以节点的形式存储:

类Node {构造函数(数据){ this.data=datathis.parent=nullthis . children=[];}}2.创建一棵树

树是用来连接节点的,就像现实世界的树干一样,有许多分支在延伸

类multi waytree { constructor(){ this。_ root=null}}3.添加节点

函数add (data,to data,traverse){ let node=new node(data)//第一次添加到根节点//返回值是这个,方便链添加节点if (this。_ root====null){ this。_ root=节点;归还这个;}让parent=null,callback=function(node){ if(node . data===ToData){ parent=node;返回真;} };//根据遍历方法找到父节点(遍历方法将在后面描述),然后将该节点添加到父节点的子数组///找到这个。在方法包含之后包含(回调、遍历);if(parent){ parent . children . push(node);node.parent=parent归还这个;} else {抛出新错误('无法将节点添加到不存在的父节点。');}}4.深度优先遍历

深度优先会先尝试从子节点开始查找,找到子节点后再从兄弟节点开始查找,适合数据深度大的情况,比如文件目录

函数traverseDF(回调){ let stack=[],found=falsestack.unshift(这个。_ root);让current node=stack . shift();while(!找到currentNode) {//根据回调函数的返回值,决定找到第一个后是否继续搜索。找到=回调(current node)==true?真:假;if(!find){//每次将子节点放在堆栈的前面,子节点堆栈。unshift(.当前节点。儿童)将在下一次搜索中被首先找到;current node=stack . shift();} }}5,广度优先遍历

广度优先遍历会优先寻找兄弟节点,逐层往下看,适合子项目多的情况,比如公司职位级别

函数traverseBF(回调){ let queue=[],found=falsequeue.push(这个。_ root);让current node=queue . shift();while(!找到currentNode) {//根据回调函数的返回值,决定找到第一个后是否继续搜索。找到=回调(current node)==true?真:假;if(!find){//每次将子节点放在队列末尾时,下一次搜索将首先找到同级节点队列.current node . child)current node=queue . shift();} }}6,包括节点

函数包含(回调,遍历){遍历. call(this,回调);}回调函数算法可根据情况实现,灵活性高

7.移除节点

//返回移除的节点函数remove (data,from data,traverse){让parent=null,childtoremove=null,callback=function(node){ if(node。data===来自数据){ parent=node返回真;} };this.contains(回调、遍历);if (parent) { let index=this。_findIndex(parent.children,data);if(索引0) {引发新错误('要移除的节点不存在。');} else { childToRemove=parent . children . splice(index,1);} } else {抛出新错误('父级不存在');}返回childToRemove}_findIndex实现:

function _findIndex(arr,data){ let index=-1;for(设i=0,len=arr.length我透镜;i ) { if (arr[i]。data===data){ index=I;打破;} }返回索引;}完整算法

类节点{构造函数(数据){ this . data=data this . parent=null this。children=[];} }类多路树{构造函数(){ this ._ root=null} //深度优先遍历traverseDF(回调){ let stack=[],found=falsestack.unshift(这个. _ root);让当前节点=堆栈。shift();while(!找到的current node){ 0找到的=回调(当前节点)==true?真:假;if(!找到){ stack.unshift(.当前节点。儿童);当前节点=堆栈。shift();} } } //广度优先遍历traverseBF(回调){ let queue=[],found=falsequeue.push(这个. _ root);让当前节点=队列。shift();while(!找到的current node){ 0找到的=回调(当前节点)==true?真:假;if(!找到){ queue.push(.当前节点。子级)当前节点=队列。shift();} } }包含(回调,遍历){遍历。叫(这个,回调);}添加(数据,toData,遍历){让节点=新节点(数据)如果(这._ root====null){ this ._root=节点;归还这个;}让parent=null,callback=function(node){ if(node。data===ToData){ parent=node;返回真;} };this.contains(回调、遍历);if(parent){ parent。孩子们。push(节点);node.parent=parent归还这个;} else {抛出新错误('无法将节点添加到不存在的父节点。');} }移除(数据,来自数据,遍历){ let parent=null,childToRemove=null,callback=function(node){ if(node。data===来自数据){ parent=node返回真;} };this.contains(回调、遍历);if (parent) { let index=this ._findIndex(parent.children,data);如果(索引0) {引发新错误('要移除的节点不存在。');} else { childToRemove=parent。孩子们。拼接(索引,1);} } else {抛出新错误('父级不存在');}返回childToRemove} _findIndex(arr,data){ let index=-1;用于(设i=0,len=arr.length我透镜;如果.data===data){ index=I;打破;} }返回索引;}}控制台测试代码

var tree=新的多路树();tree.add('a ').添加(' b ',' a ',tree.traverseBF).添加(' c ',' a ',tree.traverseBF).添加(' d ',' a ',tree.traverseBF).添加(' e ',' b ',tree.traverseBF).添加(' f ',' b ',tree.traverseBF).添加(' g ',' c ',tree.traverseBF).添加(' h ',' c ',tree.traverseBF).添加(‘我’‘d’,树。traversebf);控制台。组(' traverseDF ');tree.traverseDF(函数(节点){ console.log(节点。数据);});控制台。组结束(' traverseDF ');控制台。组(' traverseBF ');tree.traverseBF(函数(节点){ console.log(节点。数据);});控制台。group end(' traverseBF ');//深度优先查找控制台。组(“包含1”);树。包含(函数(节点)){控制台。日志(节点。数据);if(节点。data===' f '){返回true}},树。traversedf);控制台。群组结尾('包含1 ')//广度优先查找console.group('包含2 ');树。包含(函数(节点)){控制台。日志(节点。数据);if(节点。data===' f '){返回true}},树。traversebf);控制台。GroupEnd('包含2 ');tree.remove('g ',' c ',tree。traversebf);这里使用在线HTML/CSS/JavaScript代码运行工具:http://工具。JB 51。net/code/HTMljsrun测试运行效果如下:

感兴趣的朋友可以自己测试一下看看运行效果。

更多关于Java脚本语言相关内容感兴趣的读者可查看本站专题: 《JavaScript数据结构与算法技巧总结》 、 《JavaScript数学运算用法总结》 、 《JavaScript排序算法总结》 、 《JavaScript遍历算法与技巧总结》 、 《JavaScript查找算法技巧总结》 及《JavaScript错误与调试技巧总结》

希望本文所述对大家Java脚本语言程序设计有所帮助。

版权声明:javascript数据结构多树的经典操作示例[创建、添加、遍历、移除等 ]是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。