假如数据表中的数据呈现多叉树的关联关系,当需要搜索A点,以及与A点存在关联关系的的数据时,
算法设计可以参考以下思路:
1、搜索子节点以及搜索父节点分开;
2、设计搜索子节点递归算法的时候根据具体业务需求设置递归的层级,即你所需要搜索数据的深度;
3、设计搜索父节点的递归算法的时候,需要考虑其父节点的其他子节点,在符合搜索深度的情况下,
将所有关联点搜索出来。
思路如上,现在我们设计一个大致的递归算法骨架:
1、子节点搜索算法设计
//递归搜索子元素
public int findChildren(int n,String parents,List
//首先需要传入的基本参数 : n(需要搜索的深度,本例子设置为5)
// parents (寻找子节点的条件,要根据父节点与子节点关联确定)
//childrenList (存放所有子节点的容器)
List
try {
//搜索子节点,根据你的业务具体需求来制定,这只是一个通用的思路
cl = userServiceImpl.queryUserByParents(parents);
if(n >= 5){//这里就是要开始判断是否达到最大的搜索深度了,如果达到即要跳出递归
//下面这个for循环不用怎么关心,这是根据我的业务制定的,不过要注意在这
//一步将数据放进了子节点容器
}
这里用了我之前写过的一个实例分析,架空分析可能会比较抽象。思路基本已经用上面的文字表达
出来了
2、父节点搜索算法设计
//递归搜索父级元素
public int findParents(int n,String telephone,List
//首先需要传入的基本参数 : n(需要搜索的深度,本例子设置为5)
// telephone(寻找父节点的条件,要根据父节点与子节点关联确定)
//parentsList(存放所有父节点或者是父节点的其他子节点的容器)
UserVO user = new UserVO();//父节点容器,根据具体业务进行调整user = userServiceImpl.queryUserByTelephone(telephone);
//父节点搜索,根据具体业务进行调整
if(n >= 5){//这里就是要开始判断是否达到最大的搜索深度了,如果达到即要跳出递归}
//搜索其他的子节点
}
以上为基本的算法骨架实例,使用均需要根据具体业务需求进行调整。
这只是最基本的骨架,在设计类似这种结构关联数据搜索的递归算法的时候,一定要注意递归的搜索深度,
以及没有相关子节点或者是相关父节点不存在的判断。当然这个骨架是可以继续完善以便提高算法效率的,
我大致讲下思路:
在进行父节点搜索的时候要注意一个问题,我们用过子节点的关联关系往上找父节点,在找到父节点的
同时,我们还要找其他子节点,但是如果从数据库中直接找数据的过程中是没有办法确定是其他子节点的
这个必须是你再另行判断,这样就使得不会重复搜索的情况,现在深度只有5,效率提高不显著,但是当
数据量大而且搜索深度也大的时候,效率提高是显著的。
上面提及到重复数据出现的问题,这个算法骨架不改的情况下,需要对数据进行去重,我们这个实例是通过
list集合存放数据的,而且存放的是实体类对象,其去重时需要重写equals方法。这个我之前的博客有介绍过:
http://blog.csdn.net/weixin_38120980/article/details/79134368
顺便提一下,搜索子节点的时候用的是中序遍历,即遍历顺序为左根右,当然将算法改为先序遍历和后序遍历
也是可以的,可以尝试去做。