递归:“时间不在于你拥有多少而在于你怎样使用!”

本文记录一下利用递归思想消除树形结构中五层以上的数据。

定义一个将要返回给前端的数据结构,其中children字段存放该部门其下的子部门。

public class DepartmentTreeVo {
    private Long id;

    /** 部门名称 */
    private String name;

    /** 部门负责人 */
    private String leaderName;

    /** 联系电话 */
    private String phoneNumber;

    /** 上一级id */
    private Long parentId;

    private List<DepartmentTreeVo> children;
}

现在控制每个部门只能最多五层结构,那么该如何在代码中进行控制呢?

通过数据库查询得到所有部门,将部门按照id分组,再填充到制定好的结构DepartmentTreeVo中

public List<DepartmentTreeVo> findTree() {
        List<DepartmentEntity> departments = departmentDao.findAll();

        if (!CollectionUtils.isEmpty(departments)) {
            Map<Long, DepartmentTreeVo> departmentMap = new HashMap<>();
            departments.forEach(department -> {
                DepartmentTreeVo treeNodeVo = new DepartmentTreeVo(department);
                departmentMap.put(treeNodeVo.getId(), treeNodeVo);
            });
            List<DepartmentTreeVo> treeList = new ArrayList<>();

            for (Map.Entry<Long, DepartmentTreeVo> entry : departmentMap.entrySet()) {
                DepartmentTreeVo treeNode = entry.getValue();
                if (treeNode.getParentId() == -1) {
                    treeList.add(treeNode);
                } else {
                    DepartmentTreeVo parentNode = departmentMap.get(treeNode.getParentId());
                    parentNode.addSubDepartment(treeNode);
                }
            }
            return treeList;
        }
        return Collections.emptyList();
    }

现在我们得到部门的树形结构了,如果不清晰存储模型,待我上图

圈圈代表层次,->箭头说明这个部门存在子部门,由于每一个部门都是这个情况并且列表大小不仅仅为3,咳咳大家理解就行。好的现在我需将编号为6的去除,那么我只需将编号为5的children这个列表置空即可!

如果使用if-else判断介入不是很美观的情况下这里将采用递归的方式做到如上效果。传入一个List<DepartmentVo> 将返回一个只有五层的结构 ,这里为了方便直接在这一片地址空间上进行操作。传值和传址相信大家应该了解过了,这里不做叙述。

    int num = 0;    
public List<DepartmentTreeVo> fourth(List<DepartmentTreeVo> treeList){
        if(treeList.size()>0) {

            if(num>3){
                for (DepartmentTreeVo departmentTreeVo2 : treeList) {
                    departmentTreeVo2.setChildren(null);
                    return treeList;
                }
            }else {
                for (DepartmentTreeVo treeVo : treeList) {
                    int b = num++;
                    fourth(treeVo.getChildren());
                    num=b;
                }
            }
        }
        return treeList;
    }

代码解释:这里方法名称我写为fourth是我经过四次迭代过后的代码。传入的treeList集合需要存在数据,则进入一次判断,我们将一次性处理列表中所有超过5层结构的数据,这里使用遍历列表中的一个元素,将其子部门取出进行递归处理。这里num++由于部门刚进入第一次循环时候这里处理的是第一层的结构所以会进行+1操作。而后将其设给变量b是由于我们是一次性处理所有数据需要知道目前是在递归的第几层,完成一层递归操作后+1进行下一层操作。最终num>3代表列表中某一个部门可以迭代到第五层,那么我们处理下该层的子部门为null即可完成五层结构设定。

大家可以看到整个操作完全在一个列表中对列表数据的尾删,所以可以在一个地址空间进行操作,递归时由于是循环递归所以需要标记下次数,此时的循环次数即是递归深度。最后求大神们帮忙计算该操作的时间复杂度及空间复杂度。本菜鸡将不甚感激。

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值