部门树形结构算法 — Java递归实现

时间:2025-02-06 12:25:41
/** * 构建前端所需要树结构 * * @param depts 部门列表 * @return 树结构列表 */ public List<Dept> buildDeptTree(List<Dept> depts) { List<Dept> deptList = new ArrayList<>(); List<String> deptIdList = new ArrayList<>(); for (Dept dept : depts) { deptIdList.add(dept.getDeptId()); } for (Dept dept : depts) { // 如果是*节点,遍历该父节点所有子节点 if (!deptIdList.contains(dept.getParentId())) { recursionFn(depts, dept); deptList.add(dept); } } if (deptList.isEmpty()) { deptList = depts; } return deptList; } /** * 递归列表 * 结束条件为所遍历的节点无下一级节点 * * @param list 查询获得的所有部门数据 * @param dept *节点 */ private void recursionFn(List<Dept> list, Dept dept) { // 得到子节点列表 List<Dept> childList = getChildList(list, dept); dept.setChildren(childList); for (Dept tChild : childList) { // 如果子节点有下一级节点,得到下一级的节点列表 if (hasChild(list, tChild)) { recursionFn(list, tChild); } } } /** * 获得该节点的下一级子节点列表 * * @param list 查询获得的所有部门数据 * @param dept *节点 * @return *节点的下一级子节点列表 */ private List<Dept> getChildList(List<Dept> list, Dept dept) { List<Dept> deptList = new ArrayList<>(); for(Dept d:list){ // 遍历非*节点,并获得传入参数*节点的下一级子节点列表 if (d.getParentId() != null && d.getParentId().equals(dept.getDeptId())) { deptList.add(d); } } return deptList; } /** * 判断是否有子节点 * * @param list 节点列表 * @param dept 部门节点 * @return Boolean */ private boolean hasChild(List<Dept> list, Dept dept) { return getChildList(list, dept).size() > 0; }