递归搜索级联关系算法、向上搜索五级级联父节点、向下搜索五级级联子节点

@RequestMapping(value="/queryUserByName")
@ResponseBody
public List<UserVO> queryUserByname(HttpServletRequest request){
List<UserVO> userList =new ArrayList<UserVO>();
UserVO user = new UserVO();
String name = request.getParameter("name");
try {
if(name.length() == 0){
userList = userServiceImpl.select();
}else{
user = userServiceImpl.queryUserByName(name);
if(user.getParents().length() != 0){
int n = 1;
findParents(n, user.getParents(), userList);
}
if(user.getTelephone().length() != 0){
int n = 1;
findChildren(n, user.getTelephone(), userList);
}
userList.add(user);
}
} catch (Exception e) {
e.printStackTrace();
}
return userList;
}

//递归搜索父级元素
public int findParents(int n,String telephone,List<UserVO> parentsList){
UserVO user = new UserVO();
try {
user =  userServiceImpl.queryUserByTelephone(telephone);
if(n >= 5){
user.setParents("");
parentsList.add(user);
return n;
}
parentsList.add(user);
} catch (Exception e) {
e.printStackTrace();
}
if(user.getParents().length() == 0){
return n;
}
return findParents(n+1,user.getParents(),parentsList);
}
//递归搜索子元素
public int findChildren(int n,String parents,List<UserVO> childrenList){
List<UserVO> cl = new ArrayList<UserVO>();
try {
cl = userServiceImpl.queryUserByParents(parents);
if(n >= 5){
for(UserVO c:cl){
childrenList.add(c);
}
return n;
}
} catch (Exception e) {
e.printStackTrace();
}
if(cl.size() == 0){
return n;
}
for(UserVO c:cl){
childrenList.add(c);
findChildren(n+1, c.getTelephone(), childrenList);
}
return n;
}

 1、此算法针对单表内存在级联关系的数据进行递归搜索,数据级联关系如下图:递归搜索级联关系算法、向上搜索五级级联父节点、向下搜索五级级联子节点

递归搜索级联关系算法、向上搜索五级级联父节点、向下搜索五级级联子节点

2、递归分为两部分,向上递归搜索父节点:递归结束条件为递归层级大于5、或者父节点在递归层级小于5时已经终止;向下递归搜索子节点:结束条件相同,搜索子节点时,算法一直会往左子节点递归下去,直到递归终止,然后再次回到递归初始点继续递归遍历。

 3、整个搜索算法思路,根据搜索条件先搜索出符合搜索条件的一条数据,然后根据这条数据分别向上递归搜索父节点,向下递归搜索子节点。




递归搜索级联关系算法、向上搜索五级级联父节点、向下搜索五级级联子节点