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中的左值右值_利用左值右值实现树状结构相关推荐

  1. 实现树状结构_组合模式 - 树状结构的优雅实现

    在编程实践中,经常会遇到树状结构的场景,比如我们的浏览器窗口,比如文件系统. 那么,在处理树状结构的时候有什么较好的方式呢? 现在,我们就来学习一种利用组合模式的方法. 如上图所示,我们通过程序输出的 ...

  2. 用中值排序基数法实现树状结构 (转)

    在BBS的编写中,经常有人问怎样实现树状结构?一个比较不负责任的回答是:使用递归算法.当然,递归是一个可行的办法 (二叉树的历遍也好象只能使用递归算法),但对于BBS来说,这样做势必要进行大量的Sql ...

  3. 系统管理模块_部门管理_设计(映射)本模块中的所有实体并总结设计实体的技巧_懒加载异常问题_树状结构...

    系统管理模块_部门管理_设计本模块中的所有实体并总结设计实体的技巧 设计实体流程 1,有几个实体? 一般是一组增删改查对应一个实体. 2,实体之间有什么关系? 一般是页面引用了其他的实体时,就表示与这 ...

  4. 下拉菜单实现树状结构_树形图:复杂层次结构的数据可视化

    树形图:复杂层次结构的数据可视化 作者:Page Laubheimer[1] 树形图是一种复杂的,基于区域的数据可视化,用于复杂层次结构的数据,可能难以精确解释.在许多情况下,最好使用更简单的可视化效 ...

  5. JAVA树状结构数据处理

    文章目录 前言 一.数据库中的结构 二.查询步骤 1.XML 2.VO 3.树中插入叶子 总结 前言 在工作中遇到需要对树状结构的数据进行一个处理,通过本文做出一个分享和总结.本文对数据的查询主要是通 ...

  6. mysql如何实现树状结构_实现树状结构的两种方法

    实现树状结构的两种方法 实现树状结构的两种方法 1.递归法 递归是指在函数中显式的调用它自身. 利用递归法实现树状结构的特点是写入数据速度较快,显示速度较慢(在树的分支/层次较多的情况下尤其明显).适 ...

  7. Java递归子集算法(树状结构)的逻辑和实例代码实现 @杨章隐

    Java递归算法(树状结构)的逻辑和实例 1.应用场景: 递归算法作为一个经常使用的算法,无论在API开发还是计算文件夹都是比较常用的, 在api开发过程中我们经常遇到需要返回树状结构的json 例如 ...

  8. mysql树状数据结构_树状结构的数据表如何设计?

    使用Modified Preorder Tree简直是必须的.网上可以搜一下modified preorder tree travesal找到相关资料.参考 http://www.sitepoint. ...

  9. 【JAVA】读取excel导入数据库,形成树状结构

    最近需要导入一个excel表格,存到数据库并以树状结构读取出来 下面两张图片是需要导入的excel @Transactional(rollbackFor = Exception.class)publi ...

  10. 【java工具类】四级菜单如何实现树状结构展示JSON给前端

    前言: 主要是传给前端进行树状结构操作比较好,这样可以关联上下四级选择项,所以需要把表中的数据List转成一个树状结构. 1.数据库数据是静态的四级目录 数据是这样的四级目录,没有特别明确的id进行关 ...

最新文章

  1. codeforce 570 problem E 51Nod-1503-猪和回文
  2. #论文 《Deep Residual Learning for Image Recognition》
  3. PHP错误处理 - debug_backtrace()的用法
  4. 洛谷 2759 奇怪的函数
  5. 安徽科技学院计算机二级,安徽科技大学2017年3月计算机二级考试报名时间
  6. 一起学习linux之lamp脚本
  7. double+float
  8. 个人信息保护呼吁“基本法”
  9. 在windows下编译ffmpeg
  10. 迅捷cad_迅捷数组
  11. 嵌入式和单片机有什么区别
  12. python旋转校正原理_Python+OpenCV实现旋转文本校正方式
  13. nginx的返回值替换模块sub_filter
  14. android 九宫格封装,Android 实现九宫格、点击图片放大全屏浏览等
  15. 爬虫ip在使用中被封了如何解决 ?
  16. 新版烽火HG680-LC、CM211-1zg、M304A ZN、MGV2000爱家tv通刷固件(免拆机)
  17. 北航计算机学院的博士待遇,北航博士毕业留校让人寒心的工资
  18. hive之反斜杠导致Unicode编码字段里的中文无法正常显示
  19. [转] 高度近视也不用带眼镜了 只要有恒心,坚持三年,即使800度近视也可以根治。
  20. 语音标注的具体应用场景

热门文章

  1. linux的vim显示E172,Linux命令:vim
  2. python find next_美化组4,findNext()函数
  3. mysql update 多个字段_MySql-笔记
  4. Hourglass网络
  5. solver.prototxt参数说明(二)
  6. FPGA基础之逻辑单元(LE or LC)的基本结构
  7. Workshop | 超高效的设计方法你GET了吗?Design Sprint设计冲刺工作坊
  8. 中南大学夏令营集训营
  9. python 3 递归调用与二分法
  10. 转:Ogre的MaterialSystem分析