java递归获取部门数方法

前言

递归(Recursion)在编程中是一个非常重要的概念。简单来说,递归指的是一个函数在其定义中直接或间接调用自身。这种调用机制允许函数通过分解问题为更小的相似子问题来解决复杂问题。

‌递归的定义‌
递归是一种在函数定义中调用函数自身的方法。它通常包含一个或多个基准情况(base case),用于结束递归调用链,以及一个或多个递归步骤,用于将问题分解为更小的子问题。

‌递归的原理‌

1.基准情况‌:这是递归调用的终止条件。当满足基准情况时,函数将不再调用自身,而是返回结果。
2.递归步骤‌:在递归步骤中,函数会调用自身来解决一个规模更小的相似问题。这个过程会一直持续,直到达到基准情况。

递归的示例‌

现在我将获取部门树作为示例

1.示例数据准备

/*
 Navicat Premium Data Transfer

 Source Server         : localhost-本地
 Source Server Type    : MySQL
 Source Server Version : 80036
 Source Host           : localhost:3306
 Source Schema         : test

 Target Server Type    : MySQL
 Target Server Version : 80036
 File Encoding         : 65001

 Date: 22/04/2025 01:41:05
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for sys_dept
-- ----------------------------
DROP TABLE IF EXISTS `sys_dept`;
CREATE TABLE `sys_dept`  (
  `dept_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '部门id',
  `parent_id` bigint(0) NULL DEFAULT 0 COMMENT '父部门id',
  `ancestors` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '祖级列表',
  `dept_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '部门名称',
  `order_num` int(0) NULL DEFAULT 0 COMMENT '显示顺序',
  `leader` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '负责人',
  `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '联系电话',
  `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '邮箱',
  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '部门状态(0正常 1停用)',
  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`dept_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 210 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '部门表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of sys_dept
-- ----------------------------
INSERT INTO `sys_dept` VALUES (100, 0, '0', '中国移动', 0, '张三', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-02-17 08:58:32', 'admin', '2025-03-04 10:15:38');
INSERT INTO `sys_dept` VALUES (101, 100, '0,100', '深圳总公司', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-02-17 08:58:32', '', NULL);
INSERT INTO `sys_dept` VALUES (102, 100, '0,100', '长沙分公司', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-02-17 08:58:32', '', NULL);
INSERT INTO `sys_dept` VALUES (103, 100, '0,100', '研发部门', 1, '若依', '', '', '0', '0', 'admin', '2025-02-17 08:58:32', 'admin', '2025-03-12 10:26:18');
INSERT INTO `sys_dept` VALUES (104, 101, '0,100,101', '市场部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-02-17 08:58:32', '', NULL);
INSERT INTO `sys_dept` VALUES (105, 101, '0,100,101', '测试部门', 3, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-02-17 08:58:32', '', NULL);
INSERT INTO `sys_dept` VALUES (106, 101, '0,100,101', '财务部门', 4, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-02-17 08:58:32', '', NULL);
INSERT INTO `sys_dept` VALUES (107, 101, '0,100,101', '运维部门', 5, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-02-17 08:58:32', '', NULL);
INSERT INTO `sys_dept` VALUES (108, 102, '0,100,102', '市场部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-02-17 08:58:32', '', NULL);
INSERT INTO `sys_dept` VALUES (109, 102, '0,100,102', '财务部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-02-17 08:58:32', '', NULL);

2.获取组装的部门树:

public List<SysDept> selectDeptList(SysDept dept) {
        // 最终的部门树结果
        List<SysDept>  deptTree = new ArrayList<>();
        try {
            // 1.获取所有部门信息
            List<SysDept> sysDebts = sysDeptMapper.selectDeptList(dept);
            // 2.获取根节点的部门信息(parentId=0的部门为根节点)
            List<SysDept> rootDept = sysDebts.stream().filter(s-> s.getParentId().equals(0L))
                    .collect(Collectors.toList());
            for (SysDept root : rootDept) {
                // 3.递归获取子节点
                SysDept tree = getChildren(root, sysDebts);
                // 4.添加到部门树中
                deptTree.add(tree);
            }
            return deptTree;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

3.递归获取子部门:

/**
     * 递归获取子节点
     * @param rootDept 根节点
     * @param sysDepts 所有部门信息
     * @return 树形结构的部门信息
     */
    private SysDept getChildren(SysDept rootDept, List<SysDept> sysDepts) {
        ArrayList<SysDept> children = new ArrayList<>();
        for (SysDept dept : sysDepts) {
            if (rootDept.getDeptId().equals(dept.getParentId())){
                children.add(getChildren(dept, sysDepts));
            }
        }
        rootDept.setChildren(children);
        return rootDept;

    }

4.接口数据返回:

[
    {
        "deptId": 100,
        "parentId": 0,
        "ancestors": "0",
        "deptName": "中国移动",
        "orderNum": 0,
        "leader": "张三",
        "phone": "15888888888",
        "email": "ry@qq.com",
        "status": "0",
        "delFlag": "0",
        "parentName": null,
        "children": [
            {
                "deptId": 101,
                "parentId": 100,
                "ancestors": "0,100",
                "deptName": "深圳总公司",
                "orderNum": 1,
                "leader": "若依",
                "phone": "15888888888",
                "email": "ry@qq.com",
                "status": "0",
                "delFlag": "0",
                "parentName": null,
                "children": [
                    {
                        "deptId": 104,
                        "parentId": 101,
                        "ancestors": "0,100,101",
                        "deptName": "市场部门",
                        "orderNum": 2,
                        "leader": "若依",
                        "phone": "15888888888",
                        "email": "ry@qq.com",
                        "status": "0",
                        "delFlag": "0",
                        "parentName": null,
                        "children": [],
                        "createBy": "admin",
                        "createTime": "2025-02-17 00:58:32",
                        "updateBy": null,
                        "updateTime": null
                    },
                    {
                        "deptId": 105,
                        "parentId": 101,
                        "ancestors": "0,100,101",
                        "deptName": "测试部门",
                        "orderNum": 3,
                        "leader": "若依",
                        "phone": "15888888888",
                        "email": "ry@qq.com",
                        "status": "0",
                        "delFlag": "0",
                        "parentName": null,
                        "children": [],
                        "createBy": "admin",
                        "createTime": "2025-02-17 00:58:32",
                        "updateBy": null,
                        "updateTime": null
                    },
                    {
                        "deptId": 106,
                        "parentId": 101,
                        "ancestors": "0,100,101",
                        "deptName": "财务部门",
                        "orderNum": 4,
                        "leader": "若依",
                        "phone": "15888888888",
                        "email": "ry@qq.com",
                        "status": "0",
                        "delFlag": "0",
                        "parentName": null,
                        "children": [],
                        "createBy": "admin",
                        "createTime": "2025-02-17 00:58:32",
                        "updateBy": null,
                        "updateTime": null
                    },
                    {
                        "deptId": 107,
                        "parentId": 101,
                        "ancestors": "0,100,101",
                        "deptName": "运维部门",
                        "orderNum": 5,
                        "leader": "若依",
                        "phone": "15888888888",
                        "email": "ry@qq.com",
                        "status": "0",
                        "delFlag": "0",
                        "parentName": null,
                        "children": [],
                        "createBy": "admin",
                        "createTime": "2025-02-17 00:58:32",
                        "updateBy": null,
                        "updateTime": null
                    }
                ],
                "createBy": "admin",
                "createTime": "2025-02-17 00:58:32",
                "updateBy": null,
                "updateTime": null
            },
            {
                "deptId": 103,
                "parentId": 100,
                "ancestors": "0,100",
                "deptName": "研发部门",
                "orderNum": 1,
                "leader": "若依",
                "phone": "",
                "email": "",
                "status": "0",
                "delFlag": "0",
                "parentName": null,
                "children": [],
                "createBy": "admin",
                "createTime": "2025-02-17 00:58:32",
                "updateBy": null,
                "updateTime": null
            },
            {
                "deptId": 102,
                "parentId": 100,
                "ancestors": "0,100",
                "deptName": "长沙分公司",
                "orderNum": 2,
                "leader": "若依",
                "phone": "15888888888",
                "email": "ry@qq.com",
                "status": "0",
                "delFlag": "0",
                "parentName": null,
                "children": [
                    {
                        "deptId": 108,
                        "parentId": 102,
                        "ancestors": "0,100,102",
                        "deptName": "市场部门",
                        "orderNum": 1,
                        "leader": "若依",
                        "phone": "15888888888",
                        "email": "ry@qq.com",
                        "status": "0",
                        "delFlag": "0",
                        "parentName": null,
                        "children": [],
                        "createBy": "admin",
                        "createTime": "2025-02-17 00:58:32",
                        "updateBy": null,
                        "updateTime": null
                    },
                    {
                        "deptId": 109,
                        "parentId": 102,
                        "ancestors": "0,100,102",
                        "deptName": "财务部门",
                        "orderNum": 2,
                        "leader": "若依",
                        "phone": "15888888888",
                        "email": "ry@qq.com",
                        "status": "0",
                        "delFlag": "0",
                        "parentName": null,
                        "children": [],
                        "createBy": "admin",
                        "createTime": "2025-02-17 00:58:32",
                        "updateBy": null,
                        "updateTime": null
                    }
                ],
                "createBy": "admin",
                "createTime": "2025-02-17 00:58:32",
                "updateBy": null,
                "updateTime": null
            }
        ],
        "createBy": "admin",
        "createTime": "2025-02-17 00:58:32",
        "updateBy": null,
        "updateTime": null
    }
]

注意事项‌

  • ‌效率问题‌:递归可能引发栈溢出或重复计算(如斐波那契数列的朴素递归),需结合尾递归优化动态规划改进。
  • ‌理解难度‌:需通过“递进+回归”过程分析,如阶乘的逐步展开与回溯。

‌总结‌:递归是一种强大的编程范式,适用于问题可分解为自相似结构的场景,但需谨慎设计终止条件和优化性能。

posted @ 2025-04-17 15:41  [奋斗]  阅读(106)  评论(0)    收藏  举报