递归删除树形结构的所有子节点(java和mysql实现)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 递归删除树形结构的所有子节点(java和mysql实现)

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;

查询结果

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
2月前
|
SQL Java 关系型数据库
Java连接MySQL数据库环境设置指南
请注意,在实际部署时应该避免将敏感信息(如用户名和密码)硬编码在源码文件里面;应该使用配置文件或者环境变量等更为安全可靠地方式管理这些信息。此外,在处理大量数据时考虑使用PreparedStatement而不是Statement可以提高性能并防止SQL注入攻击;同时也要注意正确处理异常情况,并且确保所有打开过得资源都被正确关闭释放掉以防止内存泄漏等问题发生。
123 13
|
4月前
|
人工智能 Java 关系型数据库
Java的时间处理与Mysql的时间查询
本文总结了Java中时间与日历的常用操作,包括时间的转换、格式化、日期加减及比较,并介绍了MySQL中按天、周、月、季度和年进行时间范围查询的方法,适用于日常开发中的时间处理需求。
|
6月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
9月前
|
存储 Java 关系型数据库
java调用mysql存储过程
在 Java 中调用 MySQL 存储过程主要借助 JDBC(Java Database Connectivity)。其核心原理是通过 JDBC 与 MySQL 建立连接,调用存储过程并处理结果。具体步骤包括:加载 JDBC 驱动、建立数据库连接、创建 CallableStatement 对象、设置存储过程参数并执行调用。此过程实现了 Java 程序与 MySQL 数据库的高效交互。
|
9月前
|
人工智能 JavaScript 关系型数据库
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
364 14
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
|
10月前
|
自然语言处理 Java 关系型数据库
Java mysql根据很长的富文本如何自动获取简介
通过使用Jsoup解析富文本并提取纯文本,然后根据需要生成简介,可以有效地处理和展示长文本内容。该方法简单高效,适用于各种应用场景。希望本文对您在Java中处理富文本并生成简介的需求提供实用的指导和帮助。
188 9
|
11月前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
732 26
|
11月前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
505 1
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
318 2
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。

推荐镜像

更多
下一篇
oss云网关配置