java中的左值右值_利用左值右值实现树状结构
image.png
1. 查询
1.1. 得到节点 Node 下的所有节点,并按树状排序
SELECT * FROM tree WHERE lft BETWEEN Node.Lft AND Node.Rgt ORDER BY lft ASC;
1.2. 得到节点 Node 的路径:
SELECT * FROM tree WHERE lft < Node.Lft AND rgt > Node.Rgt ORDER BY lft ASC;
1.3. 节点 Node 的子节点总数
(Node.Rgt-Node.Lft-1)/2
2. 修改
2.1. 增加一个节点
假设新节点的父节点是 Father,如果,这是它的第一个子节点,
nCurrent = Father.Lft;
否则,假设插入点的前一个兄弟为 Brother,
nCurrent = Brother.Rgt;
改变所有位于新节点右侧的数值:
UPDATE tree SET rgt = rgt+2 WHERE rgt > nCurrent;
UPDATE tree SET lft = lft+2 WHERE lft > nCurrent;
这样就为新插入的节点腾出了空间:
INSERT INTO tree(lft, rgt) VALUES(nCurrent+1, nCurrent+2);
2.2. 删除一个节点 Node
DELETE Node;
UPDATE tree SET rgt = rgt - 2 WHERE rgt > Node.rgt;
UPDATE tree SET lft = lft - 2 WHERE lft > Node.rgt;
2.3. 子树 SubTree 从 Father1 迁移至 Father2
相当于先插入子树,再删掉原来的子树。
子树根的左右值:
nSubTreeLeft = SubTree.Lft;
nSubTreeRight = SubTree.Rgt;
子树上所有的节点数(包括子树的根):
nSubTreeNodeNum = (nSubTreeRight - nSubTreeLeft - 1) / 2 + 1;
如果,这是 Father2 的第一个子节点,
nCurrent = Father2.Lft;
否则,假设插入点的前一个兄弟为 Brother,
nCurrent = Brother.Rgt;
腾子树空间:
UPDATE tree SET lft=lft + 2* nSubTreeNodeNum WHERE lft > nCurrent; UPDATE tree SET rgt=rgt + 2* nSubTreeNodeNum WHERE rgt > nCurrent;
移动子树:
UPDATE tree SET lft = lft + nCurrent + 1 - nSubTreeLeft, rgt = rgt + nCurrent + 1 - nSubTreeLeft WHERE lft BETWEEN nSubTreeLeft AND nSubTreeRight;
删掉原来子树占的空间:
UPDATE tree SET lft=lft -2* nSubTreeNodeNum WHERE lft > nSubTreeRight;
UPDATE tree SET rgt=rgt -2* nSubTreeNodeNum WHERE rgt > nSubTreeRight;
重构左右值
假设表结构类似:
image.png
/**
* 重构左右值
*
* @param rootId 根节点id
* @param left 左值开始值
* @return
*/
public int rebuildTree(int rootId, int left) {
int right = left + 1;
List categories = categoryMapper.selectByParentCategoryID(rootId);
for (Category category : categories) {
right = rebuildTree(category.getId(), right);
}
Category category = categoryMapper.selectByPrimaryKey(rootId);
category.setLft(left);
category.setRgt(right);
categoryMapper.updateByPrimaryKey(category);
return right + 1;
}
java中的左值右值_利用左值右值实现树状结构相关推荐
- 实现树状结构_组合模式 - 树状结构的优雅实现
在编程实践中,经常会遇到树状结构的场景,比如我们的浏览器窗口,比如文件系统. 那么,在处理树状结构的时候有什么较好的方式呢? 现在,我们就来学习一种利用组合模式的方法. 如上图所示,我们通过程序输出的 ...
- 用中值排序基数法实现树状结构 (转)
在BBS的编写中,经常有人问怎样实现树状结构?一个比较不负责任的回答是:使用递归算法.当然,递归是一个可行的办法 (二叉树的历遍也好象只能使用递归算法),但对于BBS来说,这样做势必要进行大量的Sql ...
- 系统管理模块_部门管理_设计(映射)本模块中的所有实体并总结设计实体的技巧_懒加载异常问题_树状结构...
系统管理模块_部门管理_设计本模块中的所有实体并总结设计实体的技巧 设计实体流程 1,有几个实体? 一般是一组增删改查对应一个实体. 2,实体之间有什么关系? 一般是页面引用了其他的实体时,就表示与这 ...
- 下拉菜单实现树状结构_树形图:复杂层次结构的数据可视化
树形图:复杂层次结构的数据可视化 作者:Page Laubheimer[1] 树形图是一种复杂的,基于区域的数据可视化,用于复杂层次结构的数据,可能难以精确解释.在许多情况下,最好使用更简单的可视化效 ...
- JAVA树状结构数据处理
文章目录 前言 一.数据库中的结构 二.查询步骤 1.XML 2.VO 3.树中插入叶子 总结 前言 在工作中遇到需要对树状结构的数据进行一个处理,通过本文做出一个分享和总结.本文对数据的查询主要是通 ...
- mysql如何实现树状结构_实现树状结构的两种方法
实现树状结构的两种方法 实现树状结构的两种方法 1.递归法 递归是指在函数中显式的调用它自身. 利用递归法实现树状结构的特点是写入数据速度较快,显示速度较慢(在树的分支/层次较多的情况下尤其明显).适 ...
- Java递归子集算法(树状结构)的逻辑和实例代码实现 @杨章隐
Java递归算法(树状结构)的逻辑和实例 1.应用场景: 递归算法作为一个经常使用的算法,无论在API开发还是计算文件夹都是比较常用的, 在api开发过程中我们经常遇到需要返回树状结构的json 例如 ...
- mysql树状数据结构_树状结构的数据表如何设计?
使用Modified Preorder Tree简直是必须的.网上可以搜一下modified preorder tree travesal找到相关资料.参考 http://www.sitepoint. ...
- 【JAVA】读取excel导入数据库,形成树状结构
最近需要导入一个excel表格,存到数据库并以树状结构读取出来 下面两张图片是需要导入的excel @Transactional(rollbackFor = Exception.class)publi ...
- 【java工具类】四级菜单如何实现树状结构展示JSON给前端
前言: 主要是传给前端进行树状结构操作比较好,这样可以关联上下四级选择项,所以需要把表中的数据List转成一个树状结构. 1.数据库数据是静态的四级目录 数据是这样的四级目录,没有特别明确的id进行关 ...
最新文章
- codeforce 570 problem E 51Nod-1503-猪和回文
- #论文 《Deep Residual Learning for Image Recognition》
- PHP错误处理 - debug_backtrace()的用法
- 洛谷 2759 奇怪的函数
- 安徽科技学院计算机二级,安徽科技大学2017年3月计算机二级考试报名时间
- 一起学习linux之lamp脚本
- double+float
- 个人信息保护呼吁“基本法”
- 在windows下编译ffmpeg
- 迅捷cad_迅捷数组
- 嵌入式和单片机有什么区别
- python旋转校正原理_Python+OpenCV实现旋转文本校正方式
- nginx的返回值替换模块sub_filter
- android 九宫格封装,Android 实现九宫格、点击图片放大全屏浏览等
- 爬虫ip在使用中被封了如何解决 ?
- 新版烽火HG680-LC、CM211-1zg、M304A ZN、MGV2000爱家tv通刷固件(免拆机)
- 北航计算机学院的博士待遇,北航博士毕业留校让人寒心的工资
- hive之反斜杠导致Unicode编码字段里的中文无法正常显示
- [转] 高度近视也不用带眼镜了 只要有恒心,坚持三年,即使800度近视也可以根治。
- 语音标注的具体应用场景