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

将查询到的部门列表数据,进行父子节点树形结构排序 该功能适用需要树形结构的,不仅仅是部门树

步骤:

  1. 查询数据库,获得所有的部门列表
  2. 调用下面的实现方法

一、建表语句

CREATE TABLE `dept` (
  `deptId` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键,
  `name` varchar(32) DEFAULT NULL COMMENT 部门名称,
  `parentId` bigint(20) DEFAULT NULL COMMENT 父级部门ID,
  PRIMARY KEY (`deptId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

数据例如:

二、Java实体类

package com.changge.pojo;

import java.util.ArrayList;
import java.util.List;

/**
 * 部门实体
 *
 * @author changge
 */
public class Dept {
          
   

    /**
     * 部门id
     */
    private String deptId;

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

    /**
     * 父部门id
     */
    private String parentId;

    /**
     * 子部门
     */
    private List<Dept> children = new ArrayList<>();
    
    // get,set等方法省略
    ...

三、实现方法代码

/**
     * 构建前端所需要树结构
     *
     * @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;
    }
经验分享 程序员 微信小程序 职场和发展