有一张模拟多叉树的表tree的结构如下(表中不含有外键,即parent并不是指向自己id的外键):
Field Type Null Key
id int(11) NO PRI
name varchar(30) YES
parent int(11) YES
type_isleaf int(11) YES
最顶层的父节点的parent默认为0,如果现在给你任意一条表中的记录,也就相当于树上的一个节点,让你删除该节点以及它所有的子孙节点。
我想一般的方法会是采用递归,从这个节点开始,先找到这个节点的所有子节点放入一个list中,然后再对list中的每个节点进行递归查询到每个节点的子节点,均可以加入此list,直到递归到最下面的叶子层的节点,然后删除list中的所有节点,不过个人感觉递归首先第一个问题就是效率比较低。
我一般使用的方法是先直接将该节点删除,然后循环删除parent在表中找不到对应的父节点id的所有记录,直到执行删除语句时0 rows affected,说明该节点的所有子孙节点已经全部删除了。可以使用如下的数据库伪码表示:
如果给你的节点的id是8(代码使用JDBC硬编码来说明吧,如果使用一些持久层框架的话,可能代码要简单不少)
//删除该指定的节点
PreparedStatement pstmt=conn.prepareStatement("delete from tree where id =8");
pstmt.executeUpdate() ;
//找出父节点已经不存在的节点,说明被查询出的是刚刚被删除的节点的子节点
pstmt=conn.prepareStatement("select id from tree where parent not in (select id from tree)");
//如果这句查询执行有结果,说明被删除的节点有直接子节点在表中,应该将标志位置为false
resultSet=pstmt.executeQuery();
boolean tag=false;
if(resultSet.next())
tag=true;
while(tag){
resultSet.previous();//由于在if(resultSet.next())
判断中已经将光标后移了一位,所以需重新拨回去
while(resultSet.next()){
pstmt=conn.prepareStatement("delete from tree where id=?");
pstmt.setInt(1,resultSet.getInt(1));
pstmt.executeUpdate() ;
}
pstmt=conn.prepareStatement("select id from tree where parent not in (select id from tree)");
//如果这句查询执行有结果,说明被删除的节点有直接子节点在表中,应该将标志位置为false
resultSet=pstmt.executeQuery();
if(resultSet.next())
tag=true;
}
由于mysql不支持"delete from tree where parent not in(select id from tree)" 这条语句的执行,所以复杂了许多,不然直接可以
while(getAffectedRows("delete from tree where parent not in(select id from tree)" ")) {
} ,使用这一句即可. ----- getAffectedRows()表示受影响的记录行数。
哈哈,终于写了自己的第一篇博客,不管是内容还是写的点感觉都很废物,马上就要去百度实习了,权当自娱吧,纪念一下自己即将结束的大三生活吧。
分享到:
相关推荐
在数据库中,树形结构通常通过自关联来表示,即一个表的某个字段引用该表自身,形成一个层级关系。对于单表递归,这意味着所有节点都在同一张表中,通过一个父节点ID字段来标识其子节点。 创建这样的结构,我们需要...
删除某一个节点的子树意味着删除该节点和它的所有子孙节点。 算法设计:为了解决这个问题,我们可以设计一个递归函数,名称为deleteSubtree。该函数的参数为要删除的节点值 x 和当前节点的指针。函数的返回值为布尔...
在数据库设计中,树形结构是一种常见的数据组织方式,它被广泛应用于表示层次关系,例如组织结构、分类系统等。本文以食品族谱为例,探讨如何在关系型数据库中存储和操作树形结构数据。 首先,最基本的树形结构设计...
首先,让我们假设有一个名为`employees`的表,它包含了员工的ID(`id`)、员工的名字(`name`)、以及他们的上级ID(`parent_id`)。这样的表结构可以构建一个简单的树形结构,每个员工可以有零个或多个下属,而`...
新建一个mask_list节点,一个procedure节点,将上面的mask_list和procedure节点的所有子孙节点添加到新建的mask_list和procedure节点 XmlElement mask_list = xmlDoc.CreateElement("mask_list"); XmlElement ...
左右编码树形结构的优势在于能够快速地进行遍历、插入、删除和查询操作,尤其在大型树结构中,效率远高于递归查询。这种结构在数据库设计中广泛应用于构建导航菜单、组织结构、权限管理等场景,因为它能有效地支持...
在安卓应用开发中,"树形主键"(Tree-like Primary Key)是一个概念,用于组织数据结构,特别是在处理层级关系或者具有嵌套属性的数据时。它不同于传统的单一主键,而是通过一种方式来表示数据之间的父子关系。在...
通过比较节点的左值和右值,我们可以轻松获取节点的父节点、子孙节点的数量,以及节点在树中的层次。 查询特定节点及其子孙节点的SQL语句非常简单,只需要使用`BETWEEN`操作符,如查询“食品”及其子孙节点:`...
【左右值编码】是一种在数据库中存储无限分级树形结构的有效方法,主要应用于有层级关系的数据,如组织架构、商品分类等。这种方法的核心思想是为每个节点分配两个数值:左值(Lft)和右值(Rgt),通过这两个值可以...
在MySQL中,构建和操作树形结构数据是一个常见的需求,特别是在组织层次结构、菜单系统或者类别管理等场景。本PDF文档介绍了一种方法,通过递归调用存储过程来获取树节点及其子树。以下是对相关知识点的详细说明: ...
此外,dtree库可能还提供了展开/折叠节点、获取节点的所有子孙节点、检查节点是否存在等功能,这些特性有助于在用户界面中构建交互式的树形组件。 在实际应用中,dtree库常常与前端框架(如React、Vue或Angular)...
这样,我们可以快速计算出节点与其子孙节点间以及兄弟节点间的联合权值。 对于Codefest 16.The Chocolate Spree问题,目标是在树上选择两条不相交的路径,使得路径上的点权和最大。这里,我们可以利用树形DP来维护...
首先,要创建一个树形图表,你需要在ECharts配置中设置`series->type`为`'tree'`。ECharts提供了两种基本布局方式:正交树(Orthogonal)和径向树(Radial)。正交树按照水平或垂直方向展现,而径向树则以中心辐射状...
在一个非空树中,存在一个特殊的节点称为根节点,其余节点可以分为m(m>0)个互不相交的子集,每个子集本身又是一棵树,并且称为根节点的子树。树形结构广泛应用于计算机科学的多个领域,如文件系统、编译器设计和...
形式化定义中,树由节点集合K和关系R组成,满足特定条件:根节点无前驱,其他节点只有一个前驱,多个后继。 树的表示方式多样,包括树形表示法、文氏图表示法、凹入表示法和括号表示法。这些表示方法有助于理解和...
### 数据结构中的树与二叉树 #### 6.1 树的基本概念和术语 - **树的定义**: ...通过对这些基础知识的理解,可以帮助我们更好地掌握树形结构的特点以及如何在实际编程中应用这些结构来解决问题。
这种结构中的节点形成分支和层次关系,类似于自然界中的树,因此被称为树形结构。 #### 二、树形结构的应用 - **现实世界中的例子**:例如家族关系、组织架构等都可以用树形结构来表示。 - **算法实现**:许多算法...