当前位置: 首页 > news >正文

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后批量入库即可,速度很快。

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

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

http://www.cnnetsun.cn/news/3873817.html

相关文章:

  • 2026最新6款AI编程工具基础版免费深度对比
  • 域名主机怎么选,网站建设怎么搞,这才是普通人低成本搭建网站的真相
  • Cadence Allegro SKILL脚本实战:快速提取单颗元件封装、引脚与网络信息
  • 3分钟掌握Layerdivider:AI驱动的智能图片分层工具
  • PyTorch CUDA GPU加速:从环境配置到性能优化的完整指南
  • Zygisk-Assistant:Android Root隐藏技术的深度架构剖析
  • 淘客网站建设教程:新手从零搭建高转化佣金网站的全案指南
  • NGA论坛增强脚本:终极浏览体验优化指南
  • 剪辑师不外传的补救技巧:背景虚化,让你的干货视频脱颖而出!
  • KKCE: 基于在线 Ping 反向拓扑的“最后一公里”路由环回检测-快快测
  • 短视频博主如何通过知漫剧挂载小程序变现?2026实操步
  • OpenClaw智能体框架:从感知到执行的自动化工作流构建指南
  • 网站建设的认识:从底层逻辑到实战避坑,揭秘互联网入口的构建真相
  • Unity URP下MipMap可视化工具:从原理到实现的完整方案
  • AI变焦双摄家用摄像头:从被动监控到主动观察的智能安防新方案
  • 3分钟搞定防撤回:你的微信QQ消息永久保存终极方案
  • G-Helper终极指南:释放华硕笔记本潜能的免费轻量控制神器
  • 2024阀门网站建设指南:如何通过专业的阀门网站建设打造行业爆款
  • 深入解析扩频技术:从抗干扰原理到Wi-Fi、蓝牙、GPS的工程实践
  • HST水平同步压缩变换:原理、实现与工程应用
  • Roguelike卡牌新作《黑夜轮回》8月5日正式登陆Steam,首发9折优惠开启
  • Vue3+Element Plus表格样式深度定制:从CSS变量到动态行背景实战
  • 上海网站建设团队如何避坑指南与专业选择全解析
  • UE声音节点Modulator
  • AI做会员服务:为什么92%的企业在第3个月就放弃?揭秘存活率翻倍的4个关键决策点
  • AI驱动的研究工作流:重构科研效率与创新路径的核心实践框架
  • 如何在Windows电脑上快速安装APK文件:APK安装器终极指南
  • 2026鞍山铸铝门厂家,品质之选
  • 选型时都说‘支持定制’,成人培训机构签约后才发现:每个字段都要额外收费
  • 【IMX6ULL】学习笔记(一)使用ADB替代NFS实现开发板文件传输与调试