JS树结构数据的遍历

JavaScript07

JS树结构数据的遍历,第1张

title: JS树结构数据的遍历

date: 2022-04-14

description: 针对项目中出现树形结构数据的时候,我们怎样去操作他

项目中我们会经常出现对树形结构的遍历、查找和转换的场景,比如说DOM树、族谱、社会机构、组织架构、权限、菜单、省市区、路由、标签等等。那针对这些场景和数据,我们又如何去遍历和操作,有什么方式或者技巧可以简化我们的实现思路。下面我们将针对常规出现的场景去总结一下我们的遍历方式

树的特点

1、每个节点都只有有限个子节点或无子节点;

2、没有父节点的节点称为根节点;

3、每一个非根节点有且只有一个父节点;

4、除了根节点外,每个子节点可以分为多个不相交的子树;

5、树里面没有环路

下面的图片表示一颗树

在下面的JS中我们由多棵树组成我们的数据

在这数据中我们如何评判数据是否为叶节点(也就是最后一级),我们每个节点都会存在children属性,如果不存在children属性或者children不是一个数组或者children为数组且长度为0我们则认为他是一个叶节点

我们针对树结构的操作离不开遍历,遍历的话又分为广度优先遍历、深度优先遍历。其中深度优先遍历可以通过递归和循环的方式实现,而广度优先遍历的话是非递归的

从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问结点,访问完一层就进入下一层,直到没有结点可以访问为止。即访问树结构的第n+1层前必须先访问完第n层。

简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。

所以我们的实现思路是,维护一个队列,队列的初始值为树结构根节点组成的列表,重复执行以下步骤直到队列为空:

取出队列中的第一个元素,进行访问相关操作,然后将其后代元素(如果有)全部追加到队列最后。

深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止

1、先序遍历

访问子树的时候,先访问根再访问根的子树

2、后序遍历

访问子树的时候,先访问子树再访问根

1、先序遍历

先序遍历与广度优先循环实现类似,要维护一个队列,不同的是子节点不追加到队列最后,而是加到队列最前面

2、后序遍历

后序遍历就略微复杂一点,我们需要不断将子树扩展到根节点前面去,执行列表遍历,并且通过一个临时对象维护一个id列表,当遍历到某个节点如果它没有子节点或者它本身已经存在于我们的临时id列表,则执行访问操作,否则继续扩展子节点到当前节点前面

对于树结构的遍历操作,其实递归是最基础,也是最容易理解的。递归本身就是循环的思想,所以可以用循环来改写递归,以上的方式在项目中已经廊括了大部分的场景了,我们在日常开发中可以根据场景或者需要去选择我们的遍历方式,或者基于此对他进行调整和优化,至于每种方式的空间复杂度和时间复杂度我们在这个地方就不去尝试了,各位感兴趣可以自己去验证。

广度优先搜索

树的遍历

深度优先搜索

图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)

二叉树遍历(前序,后序,中序,层次)递归与迭代实现JavaScript

JS树结构操作:查找、遍历、筛选、树和列表相互转换

如果是在广州的话,不知道你会不会有这样的感觉,以餐厅为里,各种高大上的酒楼琳琅满目,但是,在很多老城区西关,也充满了各具特色隐藏的美食,装修低调但充满惊喜,味道出品好不比大酒楼的差,这也从侧面反应广州的一种特色,不一定名气大牌面大的地方才有好东西,消费者的好口碑广州人最看重的部分,美食如此,培训机构也如此。

传统的培训机构,牌子大名气大的机构这里就不再阐述了,相信题主也会有所了解。

IT培训费用不便宜、时间也长,需要慎重考量,这里给几个建议点,需要题主自己亲自去对比考量,才能找到适合自己的IT培训机构:

1、成立时间:

这几年经济环境充满不确定性,很多机构都生存得不太稳定,无论大小机构,建议选择成立3-4年以上的,具有一定抗风险性,你懂的。

2、大班or小班教学:

IT学习门槛较高,如果是4-50人的大班学习,容易走神分神,或者做练习时,有问题无法和老师深入交流沟通,没法做得那么精细化管理和补课,50人,每人向老师提问1个问题的话,那么基本都不用讲课了。

3、是否有真实的实战项目:

很多机构都是用“仿站”来给学生布置作业和练习,但缺少了真实的实战项目,没有实战项目的话,缺少的是真正的开发经验,和流程体验,真实的项目还能写进简历作为开发经验。仿站的话几乎不行。

4、是否有严谨的考核制度和补课服务:

除了正常的学习、练习以外,考核与补习机制,也是十分重要的,如果考核机制和补课不完善,容易为后期埋下大坑,IT编程学习都是环环相扣的,根基打不好后面就很难学会。

5、是否有就业服务or就业保障:

【注意】,前面的可以不怎么看,这点一定要看,【就业保障】≠【包你就业】,大部分机构主要是辅助你去做模拟面试和简历指导,这是正常的,如果机构说【包你就业】,多半是销售在忽悠你。千万别幻想报了个培训,就随便学习,然后等分配工作,这是不可能的。

说了这么多,都是满满的干货,希望对大家有所帮助。

html代码 变动之处

<input type="radio" value="住院" name="方式"onclick="ss(this)" >入院

<input type="radio" value="不住院" name="方式" onclick="ss(this)">不住院

<input id="ss" type="radio" value="否" name="是否加入" onclick="check()">否

js代码

当选择否的时候 将 住院 不住院 设置为 不选

function check() {

var x=document.getElementsByName("方式")

for(var i=0i<x.lengthi++)

{

x[i].checked=false

}

}

如果在选中否的状态下,再次点击 住院 或者不住院 给予提示 无法操作

function ss(y)

{

var x=document.getElementById("ss")

if(x.checked==true)

{

y.checked=false

alert("无法操作")

}

}