使用递归删除树形结构的所有子节点(java和mysql实现)
作者:李西召 发布时间:2024-01-12 23:22:16
标签:递归,删除,树形结构,子节点
1.业务场景
有如下树形结构:
+—0
+—1
+—2
+—4
+—5
+—3
如果删除某个父节点,则其子节点,以及其子节点的子节点,以此类推,需要全部删除。
2.Java实现
使用Map存储树形结构的数据,id为map的key,pid为树形结构的value。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
public class TreeNodes {
public static void main(String[] args) {
test();
}
//测试removeSons方法
public static void test(){
//原始的Map
Map<Integer, Integer> t=new HashMap<Integer, Integer>();
// ID PID
t.put(1, 0);
t.put(2, 1);
t.put(3, 1);
t.put(4, 2);
t.put(5, 4);
System.out.println("—— —— —— —— —— ——原始的Map —— —— —— —— —— —— ——");
Set<Integer> keys=t.keySet();
Iterator<Integer> iterator=keys.iterator();
System.out.println("ID —— PID");
while(iterator.hasNext()){
Integer i=iterator.next();
System.out.println(i+" —— "+t.get(i));
}
int k=2;
//递归删除k的所有子节点
System.out.println("—— —— —— —— —— ——删除掉的节点 —— —— —— —— —— —— ——");
removeTreeNodes(t,k);
//删除k节点本身
t.remove(k);
System.out.println();
System.out.println("—— —— —— —— —— —— 递归删除["+k+"]的所有子节点后的Map —— —— ");
iterator=keys.iterator();
System.out.println("ID —— PID");
while(iterator.hasNext()){
Integer i=iterator.next();
System.out.println(i+" —— "+t.get(i));
}
}
//递归删除所有的子节点
public static Map<Integer, Integer> removeTreeNodes(Map<Integer, Integer> t,Integer k){
//所有需要删除的子节点
List<Integer> sons=new ArrayList<Integer>();
sons.add(k);
List<Integer> temp=new ArrayList<Integer>();
//循环递归删除,所有以k为父节点的节点
while(true){
for(Integer s:sons){
Set<Integer> keys=t.keySet();
Iterator<Integer> it=keys.iterator();
while(it.hasNext()){
Integer n=it.next();
//如果父节点(即Map的value)为需要删除的节点,则记录此节点,并在Map中删除
if(t.get(n)==s){
temp.add(n);
it.remove();
System.out.println("删除了ID=["+n+"]的节点,其父节点为["+s+"]");
}
}
}
//如果此节点包含子节点,则将子节点赋值给sons;否则表示所有子节点已经删除,结束循环
if(temp.size()>0){
sons=temp;
temp=new CopyOnWriteArrayList<Integer>();
}else{
break;
}
}
return t;
}
}
3.SQL实现
利用存储过程,将所有子节点存储到临时表里。
存储过程执行完后会产生一个临时表,id为需要删除的子节点id,nLevel 为节点深度,sCort 为排序字段。
建表并插入数据:
CREATE TABLE treeNodes
(
id INT PRIMARY KEY,
pid INT
);
INSERT INTO treeNodes VALUES
(1, 0),
(2, 1),
(3, 1),
(4, 2),
(5, 4);
创建并调用存储过程:
DELIMITER//
DROP PROCEDURE IF EXISTS removeTreeNodes//
CREATE PROCEDURE removeTreeNodes(IN rootid INT)
BEGIN
DECLARE LEVEL INT ;
DROP TABLE IF EXISTS tempNodes;
CREATE TABLE tempNodes (
id INT,
nLevel INT,
sCort VARCHAR(8000)
);
SET LEVEL=0 ;
INSERT INTO tempNodes SELECT id,LEVEL,ID FROM treeNodes WHERE PID=rootid;
WHILE ROW_COUNT()>0 DO
SET LEVEL=LEVEL+1 ;
INSERT INTO tempNodes
SELECT A.ID,LEVEL,CONCAT(B.sCort,A.ID) FROM treeNodes A,tempNodes B
WHERE A.PID=B.ID AND B.nLevel=LEVEL-1 ;
END WHILE;
END;
//
DELIMITER ;
CALL removeTreeNodes(0);
下面是需要删除的子节点:
SELECT CONCAT(SPACE(B.nLevel*2),'+--',A.id)
FROM treeNodes A,tempNodes B
WHERE A.ID=B.ID
ORDER BY B.sCort;
来源:http://blog.csdn.net/sinat_26342009/article/details/51907374


猜你喜欢
- Supervisor 是一个类 unix 操作系统下的进程监控管理工具。安装 SupervisorSupervisor 是由 Python
- 1.下载 4个rpm包mysql-community-client-5.7.26-1.el7.x86_64.rpmmysql-communi
- 在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数,例如SUM, COUNT, MAX,
- 本文实例讲述了Python 异常的捕获、异常的传递与主动抛出异常操作。分享给大家供大家参考,具体如下:异常的捕获demo.py(异常的捕获)
- 目录1.什么是高阶函数?2.高阶函数-map、filter、reduce2.1map函数2.2filter函数2.3reduce函数1.什么
- 在一个大型的项目中,不可避免会出现操作时间的业务,比如时间的格式化,比如时间的加减,我们一般会直接使用moment.js库来做,毕竟稳定可靠
- 0.引言利用python开发,借助Dlib库捕获摄像头中的人脸,提取人脸特征,通过计算欧氏距离来和预存的人脸特征进行对比,达到人脸识别的目的
- 本文介绍了目前6种比较常用的进度条,让大家都能直观地看到脚本运行最新的进展情况1.普通进度条在代码迭代运行中可以自己进行统计计算,并使用格式
- 废话不多说了,关键代码如下所示:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 T
- 一、引言在编写调试Python代码过程中,我们经常需要记录日志,通常我们会采用python自带的内置标准库logging,但是使用该库,配置
- 要下午传上的.结果事一多,忘记了.好不容易回来 . 这个和 dh20156 的那个,是差不多的。 找不到合适的图片,也
- python读取pdf文档一、 准备工作安装对应的库pip install pdfminer3kpip install pdfminer.s
- 按照固定的字符,拆分已有的字符串split(sep, n, expand = False):sep:用于分割的字符串n:分割为多少列expa
- 前言这个只是使用面向对象的方法写的 构思和学生管理系统(JSON模块)是一样的file_manager.py""&quo
- 1、使用dict()函数,通过其他映射(比如其他字典)或者键,值对的序列建立字典。dict1 = dict(a='a', b
- 安装librtmp包需要依赖环境较多,机器上已经安装了python2.7版本,安装librtmp包之前需要先安装依赖环境。1、安装gcc和依
- 目前是把图片存在mongodb数据库,实现一个方法,比如 访问 /get_pic/ID 能实现图片在浏览器打开,添加了一个状态,比如?fil
- 应用场景1.需要将大型MP3文件切割成较小的部分以便上传或发送。2.需要从MP3文件中提取特定的音频片段,以便用于其他目的。3.需要快速制作
- 先看Pytorch中的卷积class torch.nn.Conv2d(in_channels, out_channels, kernel_s
- 今天给vscode配置git的时候,差点没把我送走,我在配置git项目的时候会,看了一个博客文章的教学,其中配置路径的方法如下1. 在git