预排序遍历树算法的图文解释(modified preorder tree traversal algorithm)

预排序遍历树算法的无限级分类-存储过程实现 Taihom原创,因为是原创才要分的请支持一下, 该存储过程可以在版本>=MSSQL2000下使用 但在MSSQL2000下,MPTT_NODEAction的resetnode操作不能使用,但不影响整个分类的主体应用 感谢ben一同测试。如果你支持原创,请保留存储过程中对作者Taihom的文字注释和描述。 ---------------------------------------- MPTT分类算法的添加,修改,删除其实很容易,但是这个算法的排序就不是这么容易了。 我这里已经把分类的移动和排序都重新处理了,实现了MPTT分类的排序和移动 为了保证分类左右节点的连续性,这个存储过程有检测节点连续性和完整性的处理。 理论上不会因为在添加、修改、删除、移动或者排序的操作中出现节点不正确的情况。 另外,这个分类也同时兼容传统的递归。表中的PID就是上一级的父节点。 完成和发布时间:17:23 2009/5/7 ---------------------------------------- 参考文档: http://dev.mysql.com/tech-resources/articles/hierarchical-data.html ---------------------------------------- 存储过程说明: MPTT_NODEAction @Act, @ID, @Name ---------------------------------------- 这个存储过程主要处理分类的添加删除修改和恢复节点等操作 ------------------参数说明-------------- @Act add:@ID=在哪个节点下添加,@Name=添加的名称 mod:@ID=修改哪个ID,@Name=修改的名称 del:@ID=删除哪个ID remove:@ID=从数据库删除已经被删除的ID resetnode:初始化所有节点,把所有节点初始化成根节点下的子节点 restore:恢复节点:@ID,把删除的节点恢复到哪个节点下,@Name(节点ID):恢复哪个节点 ---------------------------------------- MPTT_NODEMove @ID1 int,--从哪里移动 @ID2 int,--移动到哪里? @Dir varchar(2)='>>' --移动方式 ---------------------------------------- 这个存储过程主要负责节点的移动、排序 ------------------参数说明-------------- @Dir='<' 把节点@ID1移动到@ID2的前面 @Dir='>' 把节点@ID1移动到@ID2的后面 @Dir='>>' 把节点@ID1加入到@ID2,并且作为节点@ID2的最后一个子节点 ---------------------------------------- MPTT_NODEGet @Act nvarchar(10), @ID INT=0 ---------------------------------------- 这个存储过程主要负责节点的筛选和选择 ------------------参数说明-------------- @Act='chklink' 用来检测节点的排序连接是否断开,0表示正常,没有断开,不等于0表示排序有错 -------------- @Act='subnode' 用来获取节点@ID的子节点 -------------- @Act='fullpath' 用来获取节点@ID的全路径 -------------- @Act='delnode' 用来获取被删除的节点列表 立即下载

 这个算法有如下几个数据结构
1 lft 代表左 left
2 rgt 代表右 right
3 lvl 代表所在的层次 level

下面这个图是一个典型的结构




我们先看一些使用方法
1 查看整个树(A)有多少节点(包含自己)
直接看根节点就行了 (right-left+1)/2 = (20-1+1)/2 = 10
这个数有10个节点

2 查看从节点A到E的路径
select * from tree where lft between 1 and 6 and rgt between 7 and 20 order by lft

得到的结果是A,B,D,E 这4个节点的数据,且按照访问路径的顺序

如果2个节点之间不是上下级的关系,则查询没有结果

反向也是一样的,可以拿到底部一个节点,到上级节点的路径
select * from tree where lft between 1 and 6 and rgt between 7 and 20 order by lft desc
唯一的区别就是排序是反向的就行了。

3 得到某个节点下面的所有节点,且按照树状结构返回
我们用B做例子
select * from tree where lft>2 and right<11 order by lft
拿到的结果是 C,D,E,F,而且顺序也是正确的。

4 拿到所有下2级的子节点
我们A做例子,这次加上了lvl的参数,因为A的level是1,所以我们查询level不大于3的。
select * from tree where lft>2 and right<11 and lvl<=3 order by lft



下面看我们新增加一个节点的方法。
我们在根节点的下面,G节点的右侧增加一个X节点



我们要做的工作就是
1 G节点的右参数为13
2 变更所有的受影响的节点,给新节点腾出空位子
所有左节点比G节点大的,都增加2
update tree set lft=lft+2 where lft>12
所有右节点比G节点大的,都增加2
update tree set rgt=rgt+2 where rgt>13
3 新节点放在空位子上,lft=14,rgt=15
这样就完成了一个新节点的增加操作。

国产操作系统替换方案:3个避坑指南 坑核心误区避坑核心原则关键动作坑一:选型只看信创信创目录=唯一标准兼容性优先,信创是约束三维评估(兼容性+信创+生态),分场景选型坑二:迁移只管能跑功能能跑=迁移成功性能确认+运维回归适配-压测-回归三阶段,基线对比坑三:不防二次迁移解决停服=完成任务一步到位,两级兼容信创路线优先,双轨制发布,终态规划。 阅读详情

相关推荐

Anaconda/Miniconda的删除和安装

要在 MacBook 上删除 Anaconda 或 Miniconda,并重新安装它,您可以按照以下步骤进行操作。

qq_27390023的博客 3029

预排序遍历树算法(左右树菜单)的认识与使用

预排序遍历树算法 预排序遍历树算法(modified preorder tree traversal),又称左右树,是树状结构的一种数据结构形式。

1469

PID温控实验平台搭建(二)——PID进阶知识介绍及源码分享

最近,我突发奇想去翻阅了一些我本科期间所做的一些小项目,发现都挺有意思的!希望通过我的讲解文章可以帮助你们少走一些弯路!今天,我要分享的是一个PID温控实验平台的搭建,这是一个系列文章,手把手地教你学习和认识PID算法,了解这种算法在温度控制中的应用。由于我知识有限,如果出现一些错误,希望大家可以帮助我指出来,我们一起学习进步!!!

qq_35953617的博客 8049

预排序遍历树算法(modified preorder tree traversal algorith

这个算法有如下几个数据结构: 1、lft 代表左 left 2、rgt 代表右 right 3、lvl 代表所在的层次 level 下面这个图是一个典型的结构: 我们先看一些使用方法 1、查看整个树(A)有多少节点...

chouni8194的博客 495

Open-AutoGLM 实战:手把手教你用 AI 操作手机「喂饭教程」

Open-AutoGLM 是一个由智谱AI开源的手机操作智能体框架,由手机端智能助手框架Phone Agent和9B大小的模型AutoGLM-Phone-9B组成,借助ADB自动执行点击、滑动、输入等操作——用户只需用自然语言描述任务,系统便能自动规划并完成整个操作流程。

blues_C的博客 1267

鸢尾花分类预测

鸢尾花数据总用有150个样本,是一个典型的分类数据集,共有3个类别,分别是山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica),每个样本的特征有4列sepal_length:萼片长度sepal_width:萼片宽度petal_length:花瓣长度petal_width:花瓣宽度这里我们定义了随机森林模型作为实例,来进行模型训练,之后我们会对其使用网格搜索找到最优的参数。

优快云 精品推荐 2191

预排序遍历树算法的图文解释

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33698043的博客 401

在 SAP BTP 上为应用开启多租户能力:基于 SaaS Provisioning 和 XSUAA 的完整实践指南

本文介绍了在SAP BTP上配置多租户应用的实战指南。主要内容包括: 多租户架构概述:解释provider子账户、consumer子账户和tenant的概念,以及数据隔离机制。 安全配置:在xs-security.json中设置tenant-mode为shared,并为SaaS Provisioning服务添加回调scope授权。 路由配置:通过manifest.yml设置TENANT_HOST_PATTERN来定义多租户访问模式,确保不同租户通过不同子域名访问同一应用。 服务绑定:将XSUAA和SaaS

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 149

预排序遍历树算法全面详解

上图是网上常见的 预排序遍历树算法 的示图,但是,我看了各种算法,始终都是同一篇文章,至于概念类的东西就不说了,就说怎么插入数据 1,一级数据的left和right 毫无疑问的是 1,2 2,如果要插入二级数据怎么办呢?首先,查询当前级别是否存在数据,如果不存在,那么该级别的 第一个数据的left值为父级数据的left+1,right为父级的left+2,其他数据无论左右值,大于left-1的

fengxiaotx的专栏 3348

【算法】克里金kriging参数值预测模型

模型中特征值2个,目标值1个,data数据集如图所示。搭建kriging参数值预测模型。

weixin_48618536的博客 5060

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第1套模块A:网络构建 & (五)无线网络配置+(六)出口网络配置-命令配置

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第1套模块A:网络构建 & (五)无线网络配置+(六)出口网络配置-命令配置

君逍遥o 408

预排序遍历树算法的图文解释 modified preorder tree traversal algorithm

预排序遍历树算法的图文解释 modified preorder tree traversal algorithm

jgfyyfd的博客 334

ERROR: Ignored the following yanked versions: 0.8.3, 0.10.19.dev18 的解决办法

关于这个问题,博主是在进行项目中的python依赖包安装的时候遇见的,遇到的异常:关于这个问题,是在。

Spring Boot-Common On With You 643

(转) 数据库 预排序遍历树算法(非递归无限极分类算法)学习笔记

预排序遍历树算法(非递归无限极分类算法)学习笔记 本文是我学习MySQL官方教程Managing Hierarchical Data in MySQL的笔记 多层数据结构估计所有的web开发者估计都不会陌生,各种软件的分类都是基于多层结构来设计的。 下面是一个典型的多层数据结构示意图: [img]http://be-evil.org/content/uploadfile/201...

shijie1987ssj的专栏 400

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

关系型数据库树形结构的设计

在进行程序设计的时候,树形结构常常被用来表征某些数据的关联关系,如企业上下级部门、商品分类、文件目录等等。这些树状结构需要借助于数据库完成持久化,而关系型数据库并没有对应的原生数据结构去存储查询这种数据结构,因此,设计一种合适的结构进行存储与查询是实现树状结构长久化存储的关键。

xinyu的记录博客 2823

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数据结构和算法:预排序遍历树算法(MPTT)

一、多级分类问题 在实际开发的过程中,会经常遇到多级分类的问题。譬如,导航栏、菜单、商品种类、多级联动、字典表等等的多级分类问题。这时可以新增一个 pid 字段进行数据关联,它本质上其实就是一棵树。树就可以很好的解决多级分类的子分类查询。 但是这种方式有一个致命的问题:查询效率过低!!! 当我们在程序里查询某个子节点时,要先从根节点进行递归查询,时间复杂度是 O(n)。 那么有没有一种方式,改进树的查询效率呢?答案是肯定的!很多树都在标准的树上进行改进过,比如二叉树、红黑树、堆等等。但这都不是重点,今天要

极客点儿 3718

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

预排序遍历树算法

预排序遍历树算法 想用这个算法的原因起源于一个帖子:http://bbs.youkuaiyun.com/topics/392012391 预排序遍历树算法(modified preorder tree traversal algorithm) 这种方法大家可能接触的比较少,初次使用也不像上面的方法(邻接表)容易理解,但是由于这种方法不使用递归查询算法,有更高的查询效率。

misaka去年夏天的博客 8396

tree traversal (树的遍历) - 中序遍历 (inorder traversal) - 二叉树的中序遍历

tree traversal (树的遍历) - 中序遍历 (inorder traversal) - 二叉树的中序遍历 1. tree traversal (树的遍历) 1.1 深度优先搜索 (depth-first search,DFS) 我们采用深度作为优先级,从根节点开始一直到达某个确定的叶子节点,然后再返回根节点到达另一个分支。深度优先搜索策略可以根据根节点、左孩子树和右孩子树的相对顺序被...

程永强 5036

【数据结构与算法】——排序

插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 具体实现 希尔排序(Shellsort),也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。以23, 10, 4, 1的步长序列进行希尔

m0_62179366的博客 602

存储树状结构(下)─预排序遍历树方式

预排序遍历树方式(即通常所说的 MPTT,Modified Preorder Tree Traversal)。此算法是在第一种方式的基础之上,给每个节点增加一个左、右数字,用于标识节点的遍历顺序,如下图所示: 从根节点开始左边为 1,然后下一个节点的左边为 2,以此类推,到最低层节点之后,最低层节点的右边为其左边的数字加 1。顺着这些节点,我们可以很容易地遍历完整个树。根据上图,我们对数据表做一些

5687

算法学习1:预排序(检验数组中元素的唯一性)c语言

(算法设计与分析基础第3版 潘彦译)6.1预排序 ,例一:检验数组中元素的唯一性:伪代码自然语言与程序代码设计 如果这个元素唯一性问题看上去很熟悉,这就对了我们曾在 2.3 节(参见例 2)中考虑过该问题的一个蛮力算法。这个蛮力算法对数组中的元素对进行比较,直到找到两个相等的元素,或者所有的元素对都已比较完毕。它的最差效属于日(n)。 换一种做法,我们可以先对数组排序,然后只检查它的连续元素:如果该数组有相等的元素,则一定有一对元素是相互紧挨着的,反之亦然。

weixin_60530224的博客 1564

tree traversal (树的遍历) - 前序遍历 (preorder traversal) - 二叉树的前序遍历

tree traversal (树的遍历) - 前序遍历 (preorder traversal) - 二叉树的前序遍历 1. tree traversal (树的遍历) 1.1 深度优先搜索 (depth-first search,DFS) 我们采用深度作为优先级,从根节点开始一直到达某个确定的叶子节点,然后再返回根节点到达另一个分支。深度优先搜索策略可以根据根节点、左孩子树和右孩子树的相对顺序...

程永强 2634

实现树形菜单或分类的方法之一,使用左右值树形数据结构(modified preorder tree traversal)实现树形菜单

突然发现自己以前常用的parent_id ,node_id这种简单直观的树形结构设计效率很低,数据量一大,就需要不停迭代寻找节点,于是这几天学习了新的数据结构,在此做下笔记。 左右值数据结构网上教程很多,不再赘述,总结一下就是:要保持父节点右值比所有子节点的右值大,左节点左值比所有子结点左值小 直接上代码,上面有注释 CREATE OR REPLACE FUNCTION "pu...

Reiner的专栏 1259

【数据结构】八大排序

来自历史的智慧,经典永流传。

weixin_61932507的博客 1万+

预排序遍历树算法(modified preorder tree traversal algorithm)

这个算法有如下几个数据结构:1、lft 代表左 left2、rgt 代表右 right3、lvl 代表所在的层次 level下面这个图是一个典型的结构:我们先看一些使用方法1、查看整个树(A)有多少节点(包含自己),直接看根节点就行了 (right-left+1)/2 = (20-1+1)/2 = 10 这个数有10个节点2、查看从节点A到E的路径  1select*fromtr...

weixin_33989058的博客 331

tree traversal (树的遍历) - inorder traversal (中序遍历)

tree traversal (树的遍历) - inorder traversal (中序遍历) 1. tree traversal - 树的遍历 二叉树的遍历 (traversing binary tree) 是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。遍历是将二叉树中的结点信息由非线性排列变为某种意义上的线性排列,遍历操作使非线性结构线性化。 ...

程永强 3782
上一篇: Effective Java 中文版第二版的读书心得(四)通过私有构造器强化不可实例化的能力
下一篇: 为什么要学习?学什么?怎么学?
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值