无线递归用到的地方还是蛮多的,如果是我们itbasic上的话,那就是部门之间的关系,支撑体系下面有战略中心,战略中心下面有数据部,如果设计数据表维持这之间的关系,还有bbs,如何维护评论之间的关系(其实像laravel的论坛,他的评论关系都是从上往下一条线的,只是在评论的开头有@人的标志,我们的论坛是分为1级评论和多级,除了1级之外的评论都是在1级评论的后面按照1条线排列,没有显示主从关系),当我们需要获取这个评论的顶级的时候,我们就需要用到无线递归的知识。
以部门举例,我们在使用的过程中,需要找到这个部门的相关父级部门(子孙树),或者我们需要知道某个部门是否属于某个部门,我们既可以用家谱树去实现,也可以用子孙树去实现,用子孙树去实现的一个好处就是,当我们知道父级节点,一次性求出这个父级节点的所有子孙,通过判断子节点是否在这个父级节点的子孙中,就能知道是否满足条件。但如果我们通过家谱树,我们需要每次根据子节点,去求一次家谱,然后来判断家谱树中是否有这个父级节点存在,来判断是否符合条件。
1 | <?php |
1 | 庐阳区,合肥,安徽 |
子孙树的实现
1 | function test1($data, $id, $level = 1, &$arr) |
还记得我们在大学学习数据结构的时候,因为递归对于效率有影响,所以经常需要把递归改成迭代,上述家谱树容易修改,子孙树需要用到栈,自己不是很理解
1 | // 家谱树递归的修改成普通方式 |
大致就是上面这些,像面包屑导航,不要看着从左到右,其实他也是一棵家谱树,因为他从始至终就只有一棵树。
还有就是移动各个部门位置问题:
想象一下,一棵树,我把某个分支截取下来放到另一个分支上是很正常的事情,但问题是有时候,我会出现把父亲节点的父亲设置成自己的子节点,这样树枝就断了,这样是不可取的,除此之外,任意移动都是可以的。