public JsonResult<List<TreeVo>> tree(Long typeId) {
//查询根节点
List<Dir> dirList = dirMapper.selectList(
new LambdaQueryWrapper<Dir>()
.eq(Dir::getParentId, 0)
.eq(Dir::getTypeId, typeId));
List<DirTreeVo> voList = new ArrayList<>();
for (Dir dir : dirList) {
DirTreeVo vo = BeanUtil.copyProperties(dir, DirTreeVo.class);
List<DirTreeVo> children = findChildrenIterative(dir.getId(), typeId);
vo.setChildren(children);
voList.add(vo);
}
return JsonResult.success(voList);
}
private List<DirTreeVo> findChildrenIterative(Long parentId, Long typeId) {
List<DirTreeVo> voList = new ArrayList<>();
Queue<Long> queue = new LinkedList<>();
queue.offer(parentId);
while (!queue.isEmpty()) {
Long dirId = queue.poll();
List<Dir> dirList = dirMapper.selectList(
new LambdaQueryWrapper<Dir>().eq(Dir::getParentId, dirId).eq(Dir::getTypeId, typeId));
for (Dirdir : dirList) {
DirTreeVo vo = BeanUtil.copyProperties(dir, DirTreeVo.class);
List<DirTreeVo> children = findChildrenIterative(dir.getId(),typeId);
vo.setChildren(children);
voList.add(vo);
}
}
return voList;
}
这段代码使用了队列数据结构来进行广度优先遍历,相比于递归方式,队列方式的深度优先遍历不会耗尽栈空间