迭代器模式 树状结构深度优先遍历

503 阅读2分钟

我是超级无敌杀人王啊啊啊!!!!

Zero镇楼
lab27.gif

起因是我想做这样的分层级的列表
image.png
数据结构是一种类似树状结构的数据,使用了数组存储子节点
image.png
但是我并不想使用递归,因为递归非常野蛮!谁乱用递归谁死!image.png

解决方案很快到你家门口!

然后我写了个迭代器模式的迭代器
首先是迭代器抽象类:
image.png
因为js语言里有一个叫Iterator的接口,所以命名加了个后缀。
写个注释定一个树节点的结构体(?)
image.png
先看看数据结构和派生的成员函数,代码中注释没写那么清楚,gi是使用下标记录路径的数组,gg是使用对象的引用记录路径的数组

image.png
值得一提的是:为了增加泛用性,我使用了js中的反射机制;但也让这个迭代器更加依赖这个语言了。

image.png

因为有个成员变量gg一直在记录路径,所以取上一级(父节点)很简单。

image.png

下面是比较难的地方,但也没什么难度,只难一点点,要求树状结构无递归遍历。

image.png
我并没有魔楞到往函数里掺一堆注释的程度,所以请自行观看。建议先开饭,因为我的代码很下饭。
我的需求中并不需要递归的时候把root也渲染,所以init的时候就next了一次。
而在next中,我把get_now要用到的东西留出来了。
最后get_now,很简单:

image.png

迭代器写好后,调用会非常方便,直接写for

image.png

image.png
完美

这里执行了两次是因为这个文件被引用了两次,并不是这段代码的问题。

最后祝你,身体健康,再见! 下一篇文章我会写如何让列表进行折叠,因为解决方案强依赖于CSS层叠样式表,所以我要分两个文章写。