使用队列实现对目录树的广度优先遍历,避免栈溢出

    
    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;
    }

这段代码使用了队列数据结构来进行广度优先遍历,相比于递归方式,队列方式的深度优先遍历不会耗尽栈空间

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值