一种树形结构数据的访问方法及装置与流程

文档序号:12364061阅读:224来源:国知局
一种树形结构数据的访问方法及装置与流程
本发明涉及数据库
技术领域
,尤其涉及一种树形结构数据的访问方法及装置。
背景技术
:在进行数据存储时,经常需要使用树形数据结构来表示部门之间、事务之间等之间的关联关系。比如,在综合项目管理平台中的任务管理中,一个任务可以存在父任务、子任务,并且父任务和子任务之间通常是一对多的关系,从数据结构来看,可以将其视为树形存储结构。现有的树形数据结构,通常采用父子结点的数据库存储方式,即通过记录每一结点的父结点来记录结点之间的继承关系,并基于这种继承关系建立一个二维关系数据表。举例说明,如图1所示的树形结构示意图,从根结点至所有的叶子结点组成了一个父子关系树,其对应的二维关系数据表(表1)结构设计为{Node_id,Parent_id,Root_id}:结点标识(Node_id)结点名称(Node_name)父结点标识(Parent_id)1结点Anull2结点B13结点C14结点D15结点E3表1如表1所示的数据库设计方案,直接记录了结点之间的继承关系,简单的将以Node_id=1为根结点的树形结构的父子关系表示出来,用于持久化存储。在常见的业务场景中,每一任务的详细页面中都需要展示所有关联任务的列表(即整棵树),而根据现有数据库中任何一条记录,都只能知道当前结点及其父结点,而不可能知道其兄弟结点的具体信息和数目,更不可能知道以其兄弟结点为根的子树的信息等等,因此,需要多次的递归查询数据库去获取相关的每一个结点信息,但在递归查询过程中会不断的访问数据库,每次访问数据库I/O都会有性能开销和时间开销,而随着结点个数的增加,开销会呈几何级增加。可见,基于现有树形结构数据的存储方式,当用户访问数据库中的树形结构数据时,通常需要不断访问数据库,不但会大大降低访问效率,还增加了数据库的负担。技术实现要素:有鉴于此,本发明实施例的主要目的在于提供一种树形结构数据的访问方法及装置,能够提高数据访问效率、降低数据库的负担。本发明实施例提供了一种树形结构数据的访问方法,所述树形结构数据的数据结构为树形结构,所述树形结构中的每一结点配置有一左值和一右值;每一结点的左值和右值的配置方式为:从根结点的左侧位置开始遍历,再按照从左到右的子树顺序依次遍历完每一子树后,遍历所述根结点的右侧位置,其中,当遍历到当前子树时,从当前子树的孩子结点的左侧位置开始,按照逆时针方向依次遍历完当前子树中每一结点的左右位置;依据遍历顺序,按照升序编码方式为遍历到的每一结点位置进行编码,通过编码得到所述树形结构中每一结点的左值和右值;所述方法包括:响应于用户请求的查询被查询结点所在层数的操作,获取所述被查询结点的左值和右值;统计左值小于或等于所述被查询结点的左值且右值大于或等于所述被查询结点的右值的结点数目,所述结点数目为所述被查询结点所在的层数。可选的,所述方法还包括:响应于用户请求的查询被查询结点的子孙结点数目的操作,获取所述被查询结点的左值和右值;按照下述公式计算所述被查询结点的子孙结点数目M:M=(m1-n1-1)/2其中,m1为所述被查询结点的右值,n1为所述被查询结点的左值。可选的,所述方法还包括:响应于用户请求的查询被查询结点的所有子孙结点的操作,获取所述被查询结点的左值和右值;统计左值或右值介于所述被查询结点的左值和右值之间的所有结点,所述统计出的所有结点为所述被查询结点的所有子孙结点。可选的,所述方法还包括:响应于用户请求的查询被查询结点的所有父结点的操作,获取所述被查询结点的左值和右值;统计左值小于所述被查询结点的左值并且右值大于所述被查询结点的右值的所有结点,所述统计出的所有结点为所述被查询结点的所有父结点。可选的,所述方法还包括:响应于用户请求新增一个结点的操作,获取新增结点的父结点的右值;将所述父结点的右值作为所述新增结点的左值,将所述父结点的右值加1作为所述新增结点的右值;除所述新增结点的左右值外,将所有大于或等于所述父结点右值的左右值分别加2。可选的,述方法还包括:响应于用户请求删除结点的操作,将请求删除的待删除结点以及所述待删除结点的所有子孙结点全部删除;确定被删除的结点数目N;将所有大于所述待删除结点右值的左值和右值分别在原值的基础上减去2N。可选的,所述确定被删除的结点数目N,包括:获取所述待删除结点的左值和右值;按照下述公式计算被删除的结点数目N:N=(m2-n2+1)/2其中,m2为所述待删除结点的右值,n2为所述待删除结点的左值。本发明实施例还提供了一种树形结构数据的访问装置,所述树形结构数据的数据结构为树形结构,所述树形结构中的每一结点配置有一左值和一右值;每一结点的左值和右值的配置方式为:从根结点的左侧位置开始遍历,再按照从左到右的子树顺序依次遍历完每一子树后,遍历所述根结点的右侧位置,其中,当遍历到当前子树时,从当前子树的孩子结点的左侧位置开始,按照逆时针方向依次遍历完当前子树中每一结点的左右位置;依据遍历顺序,按照升序编码方式为遍历到的每一结点位置进行编码,通过编码得到所述树形结构中每一结点的左值和右值;所述装置包括:第一获取单元,用于响应于用户请求的查询被查询结点所在层数的操作,获取所述被查询结点的左值和右值;第一查询单元,用于统计左值小于或等于所述被查询结点的左值且右值大于或等于所述被查询结点的右值的结点数目,所述结点数目为所述被查询结点所在的层数。可选的,所述装置还包括:第二获取单元,用于响应于用户请求的查询被查询结点的子孙结点数目的操作,获取所述被查询结点的左值和右值;第二查询单元,用于按照下述公式计算所述被查询结点的子孙结点数目M:M=(m1-n1-1)/2其中,m1为所述被查询结点的右值,n1为所述被查询结点的左值。可选的,所述装置还包括:第三获取单元,用于响应于用户请求的查询被查询结点的所有子孙结点的操作,获取所述被查询结点的左值和右值;第三查询单元,用于统计左值或右值介于所述被查询结点的左值和右值之间的所有结点,所述统计出的所有结点为所述被查询结点的所有子孙结点。可选的,所述装置还包括:第四获取单元,用于响应于用户请求的查询被查询结点的所有父结点的操作,获取所述被查询结点的左值和右值;第四查询单元,用于统计左值小于所述被查询结点的左值并且右值大于所述被查询结点的右值的所有结点,所述统计出的所有结点为所述被查询结点的所有父结点。可选的,所述装置还包括:右值获取单元,用于响应于用户请求新增一个结点的操作,获取新增结点的父结点的右值;结点赋值单元,用于将所述父结点的右值作为所述新增结点的左值,将所述父结点的右值加1作为所述新增结点的右值;第一调整单元,用于除所述新增结点的左右值外,将所有大于或等于所述父结点右值的左右值分别加2。可选的,所述装置还包括:结点删除单元,用于响应于用户请求删除结点的操作,将请求删除的待删除结点以及所述待删除结点的所有子孙结点全部删除;数目确定单元,用于确定被删除的结点数目N;第二调整单元,用于将所有大于所述待删除结点右值的左值和右值分别在原值的基础上减去2N。可选的,所述数目确定单元,包括:数值获取子单元,用于获取所述待删除结点的左值和右值;数目计算子单元,用于按照下述公式计算被删除的结点数目N:N=(m2-n2+1)/2其中,m2为所述待删除结点的右值,n2为所述待删除结点的左值。本发明实施例提供的树形结构数据的访问方法及装置,从树的根结点左侧开始,依次在遍历的结点左右位置顺序标注左右值,直到回到根结点的右侧,使树形结构中的每一结点配置有一左值和一右值。基于左右值配置方式,响应于用户请求的查询被查询结点所在层数的操作,获取所述被查询结点的左值和右值;统计左值小于或等于所述被查询结点的左值且右值大于或等于所述被查询结点的右值的结点数目,所述结点数目即为所述被查询结点所在的层数。可见,本发明实施例只需要进行两次数据库查询以及数值比较操作便可获知被查询结点所在的层数,进而基于层级信息可以获知哪些结点是被查询结点的兄弟结点,进而获知其兄弟结点的相关信息,而无需进行递归查询,从而提高了数据访问效率、降低了数据库的负担。附图说明为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1为本发明实施例树形结构示意图之一;图2为本发明实施例树形结构示意图之二;图3为本发明实施例树形结构示意图之三;图4为本发明实施例树形结构数据的访问方法的流程示意图之一;图5为本发明实施例树形结构数据的访问方法的流程示意图之二;图6为本发明实施例树形结构数据的访问方法的流程示意图之三;图7为本发明实施例树形结构数据的访问方法的流程示意图之四;图8为本发明实施例树形结构示意图之四;图9为本发明实施例树形结构数据的访问方法的流程示意图之五;图10为本发明实施例树形结构示意图之五;图11为本发明实施例树形结构数据的访问方法的流程示意图之六;图12为本发明实施例树形结构数据的访问装置的组成示意图。具体实施方式为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。在介绍本发明实施例前,首先就本发明涉及的名词术语进行介绍:持久化:数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。本发明中持久化的主要应用是将内存中的对象存储在关系型的数据库中。结点:表示树中的数据元素,由数据项和数据元素之间的关系组成。父结点:结点的上层结点叫做该结点的父结点。孩子结点:结点子树的根结点。度:结点所拥有的子树的个数。分支结点:度不为0的结点,也叫非终端结点或内部结点。叶子结点:度为0的结点,也叫终端结点。兄弟结点:拥有同一父结点的孩子结点。结点层次:从根结点到树中某结点所经路径上的分支数称为该结点的层次。根结点的层次规定为1,其余结点的层次等于其双亲结点的层次加1。结点遍历:是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。对于数据库中存储的树形结构数据,所述树形结构数据的数据结构为树形结构,所述树形结构中的每一结点配置有一左值和一右值。需要说明的是,本实施例不限于树的形状、大小以及子树数目,即任何树形结构均适用于本发明实施例。为便于理解本发明实施例,下面结合图2和图3所示的树形结构示意图,以示例的方式介绍树中每一结点的左值和右值的配置方式。即,从树的根结点开始(比如根结点左值初始化为1或是其它数值),按照从上到下、从左到右的顺序遍历,依次在遍历到的结点左右位置处顺序标注数字(每次增加1),直到回到根结点的右侧位置。例1:参见图2所示的树形结构,树中每个结点配置有2个属性值:左值和右值,分别标记在结点的左侧和右侧。具体按照下述方式配置结点的左右值:树中共有5个结点,有3个子树,结点A为根结点。为便于介绍,现从左到右将各个子树分别定义为子树1、子树2和子树3,其中,子树1包括结点B(子树1的孩子结点),子树2包括结点C(子树2的孩子结点)和结点E,子树3包括结点D(子树3的孩子结点)。首先,遍历结点A的左侧位置,在结点A左侧标记结点A的左值,比如将结点A的左值初始化为1。然后,依次遍历树中的每个子树,先遍历子树1,再遍历子树2,最后遍历子树3,在遍历每个子树时,按照逆时针方向依次遍历完当前子树中每一结点的左右位置;具体地,当遍历子树1时,首先遍历结点B的左侧位置,并在结点B左侧标记结点B的左值2,再遍历结点B的右侧位置,并在结点B右侧标记结点B的右值为3;当遍历子树2时,首先遍历结点C的左侧位置,并在结点C左侧标记结点C的左值为4,然后遍历结点E的左侧位置,并在结点E左侧标记结点E的左值为5,再然后遍历结点E的右侧位置,并在结点E右侧标记结点E的右值为6,最后遍历结点C的右侧位置,并在结点C右侧标记结点C的右值为7;当遍历子树3时,首先遍历结点D的左侧位置,并在结点D左侧标记结点D的左值8,再遍历结点D的右侧位置,并在结点D右侧标记结点D的右值为9。最后,遍历结点A的右侧位置,在结点A右侧标记结点A的右值为10。按照上述配置方式,图2所示树形结构对应的数据表(表2)结构设计为{Node_id,Left_value,Right_value,Root_id}:表2如表2所示,图2所示整棵树以左右值的形式持久化存储至数据库中。例2:参见图3所示的树形结构,树中每个结点配置有2个属性值:左值和右值,分别标记在结点的左侧和右侧。具体按照下述方式配置结点的左右值:树中共有7个结点,有3个子树,结点A为根结点。为便于介绍,现从左到右将各个子树分别定义为子树1、子树2和子树3,其中,子树1包括结点B(子树1的孩子结点)、结点F和结点G,子树2包括结点C(子树2的孩子结点)和结点E,子树3包括结点D(子树3的孩子结点)。首先,遍历结点A的左侧位置,在结点A左侧标记结点A的左值,比如将结点A的左值初始化为1。然后,依次遍历树中的每个子树,先遍历子树1,再遍历子树2,最后遍历子树3,在遍历每个子树时,按照逆时针方向依次遍历完当前子树中每一结点的左右位置;具体地,当遍历子树1时,首先遍历结点B的左侧位置,并在结点B左侧标记结点B的左值2,然后遍历结点F的左侧位置,并在结点F左侧标记结点F的左值3,再然后遍历结点F的右侧位置,并在结点F右侧标记结点F的右值为4,再然后遍历结点G的左侧位置,并在结点G左侧标记结点G的左值5,再然后遍历结点G的右侧位置,并在结点G右侧标记结点G的右值为6,最后遍历结点B的右侧位置,并在结点B右侧标记结点B的右值为7;当遍历子树2时,首先遍历结点C的左侧位置,并在结点C左侧标记结点C的左值为8,然后遍历结点E的左侧位置,并在结点E左侧标记结点E的左值为9,再然后遍历结点E的右侧位置,并在结点E右侧标记结点E的右值为10,最后遍历结点C的右侧位置,并在结点C右侧标记结点C的右值为11;当遍历子树3时,首先遍历结点D的左侧位置,并在结点D左侧标记结点D的左值12,再遍历结点D的右侧位置,并在结点D右侧标记结点D的右值为13。最后,遍历结点A的右侧位置,在结点A右侧标记结点A的右值为14。按照上述配置方式,图3所示树形结构对应的数据表(表3)结构设计为{Node_id,Left_value,Right_value,Root_id}:表3如表3所示,图3所示整棵树以左右值的形式持久化存储至数据库中。基于上述举例,本实施例可以按照下述方式配置树中每一结点的左值和右值:从根结点的左侧位置开始遍历,再按照从左到右的子树顺序依次遍历完每一子树后,遍历所述根结点的右侧位置;其中,当遍历到当前子树时,从当前子树的孩子结点的左侧位置开始,按照逆时针方向依次遍历完当前子树中每一结点的左右位置;依据遍历顺序,按照升序编码方式为遍历到的每一结点位置进行编码,通过编码得到所述树形结构中每一结点的左值和右值。基于上述结点左右值的配置方式,下面结合具体实施例介绍对树形结构数据进行查询、增加、删除操作时的具体实现。参见图4,为本发明实施例提供的树形结构数据的访问方法的流程示意图之一,当用户想要查询任一结点(node_id)在树中的结点层次(layer)时,其实现步骤包括:步骤401:响应于用户请求的查询被查询结点所在层数的操作,获取所述被查询结点的左值和右值。以图2为例,该树分为3层,第1层包括结点A,第2层包括结点B、结点C、结点D,第3层包括结点E。比如,当用户想要查询结点A所在的结点层数时,可以在用户操作界面提供的查询区域内输入被查询结点A的标识1(Node_id)或结点名称,并触发层数的查询操作,此时访问装置会从数据库中获取结点A的左值1和右值10。又比如,当用户想要查询结点C所在的结点层数时,可以在用户操作界面提供的查询区域内输入被查询结点C的标识3(Node_id)或结点名称,并触发层数的查询操作,此时访问装置会从数据库中获取结点C的左值4和右值7。步骤402:统计左值小于或等于所述被查询结点的左值且右值大于或等于所述被查询结点的右值的结点数目,所述结点数目为所述被查询结点所在的层数。当被查询结点为结点A时,结点A的左值为1、右值为10,访问装置会从数据库中查找左值小于或等于1、同时右值大于或等于10的结点,满足该条件的结点只有1个结点,即结点A,则结点A所在的层数即为1。当被查询结点为结点C时,结点C的左值为4、右值为7,访问装置会从数据库中查找左值小于或等于4、同时右值大于或等于7的结点,满足该条件的结点有2个,即结点A和结点C,则结点C所在的层数即为2。本发明实施例提供的树形结构数据的访问方法,从树的根结点左侧开始,依次在遍历的结点左右位置顺序标注左右值,直到回到根结点的右侧,使树形结构中的每一结点配置有一左值和一右值。基于左右值配置方式,响应于用户请求的查询被查询结点所在层数的操作,获取所述被查询结点的左值和右值;统计左值小于或等于所述被查询结点的左值且右值大于或等于所述被查询结点的右值的结点数目,所述结点数目即为所述被查询结点所在的层数。可见,本发明实施例只需要进行两次数据库查询以及数值比较操作便可获知被查询结点所在的层数,进而基于层级信息可以获知哪些结点是被查询结点的兄弟结点,进而获知其兄弟结点的相关信息,而无需进行递归查询,从而提高了数据访问效率、降低了数据库的负担。进一步地,参见图5,为本发明实施例提供的树形结构数据的访问方法的流程示意图之二,当用户想要查询任一结点(node_id)的子孙结点数目时,其实现步骤包括:步骤501:响应于用户请求的查询被查询结点的子孙结点数目的操作,获取所述被查询结点的左值和右值。以图2为例,比如,当用户想要查询结点A的子孙结点数目时,可以在用户操作界面提供的查询区域内输入被查询结点A的标识1(Node_id)或结点名称,并触发子孙结点数目的查询操作,此时访问装置会从数据库中获取结点A的左值1和右值10。又比如,当用户想要查询结点C的子孙结点数目时,可以在用户操作界面提供的查询区域内输入被查询结点C的标识3(Node_id)或结点名称,并触发子孙结点数目的查询操作,此时访问装置会从数据库中获取结点C的左值4和右值7。步骤502:按照下述公式计算所述被查询结点的子孙结点数目M:M=(m1-n1-1)/2其中,m1为所述被查询结点的右值,n1为所述被查询结点的左值。当被查询结点为结点A时,结点A的子孙结点数目=(结点A的右值-结点A的左值-1)/2=(10-1-1)/2=4,结点A的子孙结点分别是结点B、结点C、结点D、结点E这4个结点。当被查询结点为结点C时,结点C的子孙结点数目=(结点C的右值-结点C的左值-1)/2=(7-4-1)/2=1,结点C的子孙结点是结点E。进一步地,参见图6,为本发明实施例提供的树形结构数据的访问方法的流程示意图之三,当用户想要获取任一结点(node_id)的所有子孙结点时,其实现步骤包括:步骤601:响应于用户请求的查询被查询结点的所有子孙结点的操作,获取所述被查询结点的左值和右值。以图2为例,比如,当用户想要查询结点A有哪些子孙结点时,可以在用户操作界面提供的查询区域内输入被查询结点A的标识1(Node_id)或结点名称,并触发子孙结点的查询操作,此时访问装置会从数据库中获取结点A的左值1和右值10。又比如,当用户想要查询结点C有哪些子孙结点时,可以在用户操作界面提供的查询区域内输入被查询结点C的标识3(Node_id)或结点名称,并触发子孙结点的查询操作,此时访问装置会从数据库中获取结点C的左值4和右值7。步骤602:统计左值或右值介于所述被查询结点的左值和右值之间的所有结点,所述统计出的所有结点为所述被查询结点的所有子孙结点。当被查询结点为结点A时,结点A的左值为1、右值为10,访问装置会从数据库中查找左值或右值介于1和10之间的全部结点,满足该条件的结点有4个,分别是结点B、结点C、结点D、结点E,这4个结点即为结点A的子孙结点。当被查询结点为结点C时,结点C的左值为4、右值为7,访问装置会从数据库中查找左值或右值介于4和7之间的全部结点,满足该条件的结点只有结点E,结点E即为结点A的子孙结点。进一步地,参见图7,为本发明实施例提供的树形结构数据的访问方法的流程示意图之四,当用户想要获取任一结点(node_id)所有父结点时,其实现步骤包括:步骤701:响应于用户请求的查询被查询结点的所有父结点的操作,获取所述被查询结点的左值和右值。以图2为例,比如,当用户想要查询结点A有哪些父结点时,可以在用户操作界面提供的查询区域内输入被查询结点A的标识1(Node_id)或结点名称,并触发父结点的查询操作,此时访问装置会从数据库中获取结点A的左值1和右值10。又比如,当用户想要查询结点C有哪些父结点时,可以在用户操作界面提供的查询区域内输入被查询结点C的标识3(Node_id)或结点名称,并触发父结点的查询操作,此时访问装置会从数据库中获取结点C的左值4和右值7。步骤702:统计左值小于所述被查询结点的左值并且右值大于所述被查询结点的右值的所有结点,所述统计出的所有结点为所述被查询结点的所有父结点。当被查询结点为结点A时,结点A的左值为1、右值为10,访问装置会从数据库中查找左值小于1、同时右值大于10的结点,由于没有满足该条件的结点,因此,结点A没有父结点。当被查询结点为结点C时,结点C的左值为4、右值为7,访问装置会从数据库中查找左值小于4、同时右值大于7的结点,满足该条件的结点只有结点A,因此,结点A即为结点C的父结点。从上述图4至图7的查询操作可知,在对树形结构数据进行查询时,至多进行2次数据库查询,避免了现有查询操作中的递归查询,再加上查询条件都是基于数字的比较,查询的效率是极高的,因此,随着树规模的不断扩大,基于左右值编码的设计方案将比现有递归查询方式的效率提高更多。进一步地,当用户想要在树中新增一个子孙结点时,比如,用户要在图2所示树形结构的基础上增加结点F,新增结点F的父结点为结点D,则需要对结点F配置一左值和一右值,并调整其后左右值的大小,结点增加位置及左右值变化如图8所示的树形结构示意图。下面结合图8来说明新增结点的实现方案,参见图9,为本发明实施例提供的树形结构数据的访问方法的流程示意图之五,当用户想要新增一个子孙结点时,其实现步骤包括:步骤901:响应于用户请求新增一个结点的操作,获取新增结点的父结点的右值。参见图8,当用户想要在图2所示树中增加一个结点F时,可以在用户操作界面提供的新增操作区域内输入新增结点F的标识6(Node_id)或结点名称以及其父结点D的标识4(Node_id)或结点名称,并触发新增结点的操作,此时访问装置会从数据库中获取结点D(新增结点F的父结点)的右值9。步骤902:将所述父结点的右值作为所述新增结点的左值,将所述父结点的右值加1作为所述新增结点的右值。将新增结点F的左值初始化为其父结点D的右值9,将新增结点F的右值初始化为其父结点D的(右值+1)即(9+1),此时,结点F的左值为9、右值为10。步骤903:除所述新增结点的左右值外,将所有大于或等于所述父结点右值的左右值分别加2。除新增结点F的左右值以外,将每个大于或等于9(结点D右值)的左右值分别增加2,即将结点D的右值从9调整为11(9+2),将结点A的右值从10调整为12(10+2)。可以理解的是,本实施例插入结点的操作是事务性的逐个插入,即每次只在树中插入一个结点并为该结点赋予左右值,然后调整后续结点的左右值大小,所以每次插入一个结点时后续左右值的数值调整大小为2。进一步地,当用户想要在树中删除一个结点时,会同时删除该结点的所有子孙结点,比如,如果用户要在图2所示树形结构的基础上删除结点E,如果结点E有子孙结点则同时删除,并调整其后左右值的大小,结点删除位置及左右值变化如图10所示的树形结构示意图。下面结合图10来说明删除结点的实现方案,参见图11,为本发明实施例提供的树形结构数据的访问方法的流程示意图之六,当用户想要删除一个结点时,其实现步骤包括:步骤1101:响应于用户请求删除结点的操作,将请求删除的待删除结点以及所述待删除结点的所有子孙结点全部删除。参见图10,当用户想要在图2所示树中删除结点E(所述待删除结点)时,可以在用户操作界面提供的删除操作区域内输入结点E的标识5(Node_id)或结点名称,并触发删除结点的操作,此时访问装置会从数据库中删除结点E。步骤1102:确定被删除的结点数目N。访问装置进一步确定删除了多少个结点N。步骤1102可以包括步骤A1和A2:A1:获取所述待删除结点的左值和右值。访问装置会从数据库中获取结点E(即待删除结点)的左值5和右值6。A2:按照下述公式计算被删除的结点数目N:N=(m2-n2+1)/2其中,m2为所述待删除结点的右值,n2为所述待删除结点的左值。当待删除结点为结点E时,被删除的结点数目N=(结点E的右值-结点E的左值+1)/2=(6-5+1)/2=1,可见,本删除的结点只有一个结点E,即结点E没有子孙结点。步骤1103:将所有大于所述待删除结点右值的左值和右值分别在原值的基础上减去2N。访问装置会从数据库中查找所有大于结点E右值(即待删除结点)的其它左值和右值,并将这些数值在原值的基础上减去2N,即将结点C的右值从7调整为5(7-2),将结点D的左值从8调整为6(8-2),将结点D的右值从9调整为7(9-2),将结点A的右值从10调整为8(10-2)。综上,本发明实施例通过左右值编码实现无限分组(即不限于子树的分支数)的树形结构在关系型数据库中的持久化存储,其具有数据存储冗余度小、直观性强,该发明是基于数据结构的高度抽象,只要存在树形的数据结构都可以采用本方案的左右值编码方式进行持久化存储;此外,本发明对树形结构数据的访问条件是基于数字(左右值)的比较,无需进行递归查询,因此检索遍历过程简单高效,结点增删查操作也更加高效。参见图12,为本发明实施例提供的树形结构数据的访问装置的组成示意图,所述树形结构数据的数据结构为树形结构,所述树形结构中的每一结点配置有一左值和一右值;每一结点的左值和右值的配置方式为:从根结点的左侧位置开始遍历,再按照从左到右的子树顺序依次遍历完每一子树后,遍历所述根结点的右侧位置,其中,当遍历到当前子树时,从当前子树的孩子结点的左侧位置开始,按照逆时针方向依次遍历完当前子树中每一结点的左右位置;依据遍历顺序,按照升序编码方式为遍历到的每一结点位置进行编码,通过编码得到所述树形结构中每一结点的左值和右值;所述装置包括:第一获取单元1201,用于响应于用户请求的查询被查询结点所在层数的操作,获取所述被查询结点的左值和右值;第一查询单元1202,用于统计左值小于或等于所述被查询结点的左值且右值大于或等于所述被查询结点的右值的结点数目,所述结点数目为所述被查询结点所在的层数。在本实施例中,所述装置还可以包括:第二获取单元,用于响应于用户请求的查询被查询结点的子孙结点数目的操作,获取所述被查询结点的左值和右值;第二查询单元,用于按照下述公式计算所述被查询结点的子孙结点数目M:M=(m1-n1-1)/2其中,m1为所述被查询结点的右值,n1为所述被查询结点的左值。在本实施例中,所述装置还可以包括:第三获取单元,用于响应于用户请求的查询被查询结点的所有子孙结点的操作,获取所述被查询结点的左值和右值;第三查询单元,用于统计左值或右值介于所述被查询结点的左值和右值之间的所有结点,所述统计出的所有结点为所述被查询结点的所有子孙结点。在本实施例中,所述装置还可以包括:第四获取单元,用于响应于用户请求的查询被查询结点的所有父结点的操作,获取所述被查询结点的左值和右值;第四查询单元,用于统计左值小于所述被查询结点的左值并且右值大于所述被查询结点的右值的所有结点,所述统计出的所有结点为所述被查询结点的所有父结点。在本实施例中,所述装置还可以包括:右值获取单元,用于响应于用户请求新增一个结点的操作,获取新增结点的父结点的右值;结点赋值单元,用于将所述父结点的右值作为所述新增结点的左值,将所述父结点的右值加1作为所述新增结点的右值;第一调整单元,用于除所述新增结点的左右值外,将所有大于或等于所述父结点右值的左右值分别加2。在本实施例中,所述装置还可以包括:结点删除单元,用于响应于用户请求删除结点的操作,将请求删除的待删除结点以及所述待删除结点的所有子孙结点全部删除;数目确定单元,用于确定被删除的结点数目N;第二调整单元,用于将所有大于所述待删除结点右值的左值和右值分别在原值的基础上减去2N。在本实施例中,所述数目确定单元,包括:数值获取子单元,用于获取所述待删除结点的左值和右值;数目计算子单元,用于按照下述公式计算被删除的结点数目N:N=(m2-n2+1)/2其中,m2为所述待删除结点的右值,n2为所述待删除结点的左值。通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到上述实施例方法中的全部或部分步骤可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者诸如媒体网关等网络通信设备,等等)执行本发明各个实施例或者实施例的某些部分所述的方法。需要说明的是,本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1