news 2026/8/6 17:22:42

java树结构的处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java树结构的处理

文章目录

    • 数据库
    • 组装树
      • 如果某个节点缺失如何判断呢?
    • 如何迁移?
      • 授权时的树和查询时是不一样的

树结构很常见,例如组织结构,菜单等,所以必须会套路。

数据库

至少要包含以下几个主要字段:
id
parent_id
level # 层级
leaf_flag # 是否叶子节点

CREATETABLEsys_tree_node(idbigint(20)NOTNULLAUTO_INCREMENTCOMMENT'主键ID',parent_idbigint(20)DEFAULT'0'COMMENT'父节点ID(根节点默认为0)',ancestorsvarchar(500)DEFAULT''COMMENT'祖级列表(例如:0,100,200)',node_namevarchar(100)NOTNULLCOMMENT'节点名称',node_codevarchar(100)DEFAULT''COMMENT'节点编码(用于业务关联,如部门编码、菜单标识)',node_typetinyint(4)DEFAULT'1'COMMENT'节点类型(如:1-公司, 2-部门, 3-岗位)',levelint(11)DEFAULT'1'COMMENT'层级深度(根节点为1)',leaf_flagtinyint(1)DEFAULT'0'COMMENT'是否叶子节点(0-否, 1-是)',sort_orderint(11)DEFAULT'0'COMMENT'显示排序',statustinyint(4)DEFAULT'1'COMMENT'状态(0-停用, 1-正常)',del_flagtinyint(1)DEFAULT'0'COMMENT'删除标志(0-正常, 1-已删除)',create_byvarchar(64)DEFAULT''COMMENT'创建者',create_timedatetimeDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',update_byvarchar(64)DEFAULT''COMMENT'更新者',update_timedatetimeDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'更新时间',remarkvarchar(500)DEFAULTNULLCOMMENT'备注',PRIMARYKEY(id),KEYidx_parent_id(parent_id),KEYidx_ancestors(ancestors))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='通用树结构表';

组装树

有各种方法,例如层推法等等。
比较好的是所有节点放到一个map里,然后快速遍历。代码:

publicList<TreeNode>buildTree(List<TreeNode>flatList){// 1. 将扁平列表转为 Map,Key 为节点 ID,实现 O(1) 查找Map<Long,TreeNode>nodeMap=flatList.stream().collect(Collectors.toMap(TreeNode::getId,node->node));List<TreeNode>roots=newArrayList<>();// 2. 遍历组装:找到每个节点的父节点,并挂载上去for(TreeNodenode:flatList){if(node.getParentId()==null||node.getParentId()==0){// 顶级节点(根节点)直接加入结果集roots.add(node);}else{// 非根节点,通过 Map 快速找到父节点并加入其 children 列表TreeNodeparent=nodeMap.get(node.getParentId());if(parent!=null){parent.getChildren().add(node);}}}returnroots;}

这种写法不仅时间复杂度仅为 O(n),而且代码逻辑非常清晰。

如果某个节点缺失如何判断呢?

分不同情况,例如某个叶子节点缺失,那确实发现不了。
如果某个上级节点缺失,容易发现,如果node有parentId,但是没在map中,也没在数据库中,那可以报错该节点找不到上级节点。

如何迁移?

例如A公司下有3层100个公司,迁移到另外一个中心,要做什么?

方案很明确:
1、只需要修改A公司的parentId,因为其他子节点的parentId不变。
2、level也需要刷新,但是要用优雅的方式,先计算层级差,例如原来A公司level=3,现在level=2,那么所有子节点的level+1。A公司及所有子节点查出来,level+1后批量入库即可,速度很快。

授权时的树和查询时是不一样的

授权时是整个树结构(不能只展示已授权机构,否则怎么加权限),通过复选框实现授权和取消授权。
查询时可以采用平面结构,判断起来更方便。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/6 17:21:59

2026最新6款AI编程工具基础版免费深度对比

花了两个周末&#xff0c;我把主流的几款AI编程工具挨个装了一遍&#xff0c;同一个项目用不同的工具写&#xff0c;记录下了各自的真实表现。作为一名从数据工程转业务开发的后端工程师&#xff0c;我最近在重构公司社区论坛项目的热门帖子接口&#xff0c;之前踩过性能的大坑…

作者头像 李华
网站建设 2026/8/6 17:18:20

域名主机怎么选,网站建设怎么搞,这才是普通人低成本搭建网站的真相

在这个人人都有麦克风的时代,如果你还在问“怎么做一个网站”,那我建议你首先停下来,深呼吸,喝杯茶。因为很多人对网站的认知还停留在二十年前,觉得那是什么高深莫测的技术活儿,只有穿黑T恤、戴黑框眼镜、坐在昏暗办公室里敲代码的程序员才能搞定的事。如果你这么想,那你…

作者头像 李华
网站建设 2026/8/6 17:17:30

Cadence Allegro SKILL脚本实战:快速提取单颗元件封装、引脚与网络信息

1. 先搞清楚这个“汇出”到底能帮你解决什么问题在PCB设计&#xff0c;尤其是复杂板卡的设计后期&#xff0c;经常遇到一个很具体但很烦人的问题&#xff1a;需要单独提取某个关键芯片或元件的封装、网络、属性等信息。比如&#xff0c;你想把某个BGA的封装和引脚定义单独发给封…

作者头像 李华
网站建设 2026/8/6 17:15:28

3分钟掌握Layerdivider:AI驱动的智能图片分层工具

3分钟掌握Layerdivider&#xff1a;AI驱动的智能图片分层工具 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 你是否曾经面对一张精美的插画或设计作品&a…

作者头像 李华
网站建设 2026/8/6 17:13:12

PyTorch CUDA GPU加速:从环境配置到性能优化的完整指南

1. 项目概述&#xff1a;为什么GPU加速是深度学习的“必需品”&#xff1f; 如果你刚开始接触PyTorch&#xff0c;可能会觉得在CPU上跑一个简单的MNIST分类模型也挺快。但当你把模型换成ResNet&#xff0c;把数据集换成ImageNet&#xff0c;或者开始尝试生成一张高分辨率图片时…

作者头像 李华
网站建设 2026/8/6 17:11:57

Zygisk-Assistant:Android Root隐藏技术的深度架构剖析

Zygisk-Assistant&#xff1a;Android Root隐藏技术的深度架构剖析 【免费下载链接】Zygisk-Assistant A Zygisk module to hide root for KernelSU, Magisk and APatch, designed to work on Android 5.0 and above. 项目地址: https://gitcode.com/gh_mirrors/zy/Zygisk-As…

作者头像 李华