java后端使用自下往上且复杂度为n的方法构建树形数据结构

需求

碰到这样一个需求,根据部门查询出数据后动态的构建成树形结构,结果类似于这样

        

实体类和表结构

数据库表结构是这样的,关键用id和parentId来进行构建树结构

实体类是这样的,用红框的三个字段进行构建,children用来存每个节点的下一级子节点

过程

结构就是这样,于是网上简单看了下,发现网上的方法都是从上往下构建树,就是先给定一级节点id,然后递归去找所有节点的子节点,这样的话不符合我的需求,我的需求是动态构建,构建前是不知道一级节点是哪个的,一级节点可能有很多个,而且这方法复杂度到了n的平方,于是自己写了一个,我的方法是从下往上进行构建,每个节点只有一个父亲,我只要给所有节点找到它的父亲就行了,复杂度为n,代码如下,TblInstitutionType就是节点实体类,不用管名字。

//先查出数据
List<TblInstitutionType> types = tblInstitutionTypeMapper.selectTblInstitutionTypeList(tblInstitutionType);
//用map存储,方便获取,降低复杂度
HashMap<Long,TblInstitutionType> typeHashMap = new HashMap<>(types.size());
//将所有节点加入到map中
types.forEach(type -> typeHashMap.put(type.getId(),type));
//遍历所有节点,寻找父节点并将子节点添加到父节点的孩子集合中
for (TblInstitutionType type : types) {
    Long parentId = type.getParentId();
    if (typeHashMap.containsKey(parentId)){
        typeHashMap.get(parentId).getChildren().add(type);
    }
}
//一级节点集合
List<TblInstitutionType> resultTypes = new ArrayList<>();
//将没有父节点的筛选出来,未找到父节点的说明是一级节点
for (TblInstitutionType type : types) {
    if (!typeHashMap.containsKey(type.getParentId())){
        resultTypes.add(type);
    }
}
return resultTypes;
  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值