树形结构查询

  1. 存储结构

一般来说,树形结构存的就是当前节点和父节点,例如:

1
2
3
4
5
6
7
CREATE TABLE `sys_dept` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '部门ID',
`parent_id` bigint(20) DEFAULT 0 COMMENT '父部门ID(0表示根节点)',
`dept_name` varchar(50) NOT NULL COMMENT '部门名称',
`order_num` int(11) DEFAULT 0 COMMENT '显示顺序',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  1. 实体类

image-20260517153420767

  1. 我们只需要一个简单的查询,把所有的部门都查出来。不需要写复杂的递归 SQL,把组装的工作留给 Java 程序
  2. 使用 “Map 两次遍历法”。这种方法性能最好,时间复杂度接近 O(n)
    1. 第一次遍历:把所有查出来的节点放进一个 HashMap(Key=ID, Value=对象)。这样做是为了后面找父节点时速度极快(不用傻瓜式循环)
    2. 第二次遍历:再次遍历所有节点。对于每个节点,看它的 parentId是谁。
      • 如果 parentId是 0(根节点),就把它加到最终的 rootList里。
      • 如果 parentId不是 0,就去 HashMap里找到它的父节点,把自己塞进父节点的 children列表里

代码:

image-20260517153351979

得到的Json数据:

image-20260517153651387