树节点递归删除--service层

@Service
public class ContentCategoryServiceImpl extends BaseServiceImpl<ContentCategory> implements ContentCategoryService {

    @Override
    public void deleteContentCategory(Long parentId, Long id) {
        // 声明存放需要删除的节点的容器
        List<Object> ids = new ArrayList<>();

        // 把自己的id放到ids中
        ids.add(id);

        // 使用递归获取所有需要删除的节点的id
        this.getIds(id, ids);

        // 使用父类的方法,批量删除
        super.deleteByIds(ids);

        // 查询兄弟节点,声明查询条件
        ContentCategory param = new ContentCategory();
        param.setParentId(parentId);

        // 执行查询
        int count = super.queryCountByWhere(param);

        // 判断是否没有兄弟节点
        if (count == 0) {
            // 如果没有兄弟节点
            ContentCategory parent = new ContentCategory();

            parent.setId(parentId);
            // 修改父节点的isParent为false
            parent.setIsParent(false);

            // 执行修改
            super.updateByIdSelective(parent);

        }
        // 如果还有兄弟节点,神马都不做
    }

    // 使用递归的方式查询所有的子节点的id
    private void getIds(Long id, List<Object> ids) {
        // 根据条件查询当前节点的所有的子节点
        ContentCategory param = new ContentCategory();
        param.setParentId(id);
        List<ContentCategory> list = super.queryListByWhere(param);

        // 使用递归的方式,必须设置递归的停止条件,否则会一直自己调用自己,直到内存溢出
        // 判断是否还有子节点
        if (list.size() > 0) {
            // 如果有子节点,遍历结果集
            for (ContentCategory son : list) {
                // 1.把子节点的id放到ids容器中
                ids.add(son.getId());
                // 2.执行递归,自己调用自己,查询子节点的子
                this.getIds(son.getId(), ids);
            }
        }
    }

}
时间: 2024-07-29 16:54:54

树节点递归删除--service层的相关文章

wxPython treeCtrl树节点递归遍历(复制)

下面是递归遍历.获取树节点的方法. 1 def getTreeAllText(self): 2 '''获取树控件的全部文本''' 3 result = [] 4 treeRoot = self.treeCtrl.GetRootItem() 5 rootText = self.treeCtrl.GetItemText(treeRoot) 6 result.append(u'┌'+rootText) 7 def recursivelyGetTreeItem(tree,leval): 8 ''' 递归

AVL树非递归插入删除思路

AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增加和删除可能需要通过一次或多次树旋转来重新平衡这个树.AVL树得名于它的发明者G.M. Adelson-Velsky和E.M. Landis,他们在1962年的论文<An algorithm for the organization of information>中发表了它. 节点的平衡因子是它的左子树的高度减去它的右子树的

求最值背景下动态删除线段树节点

动态最值(minmax.Cpp/c/Java)(空间限制128M) 有一个包含n个元素的数组,要求实现以下操作:DELETE k:删除位置k上的数.右边的数往左移一个位置.QUERY i j:查询位置i~j上所有数的最小值和最大值. [输入](minmax.in)输入第一行包含两个数n, m,表示原始数组的元素个数和操作的个数.第二行包括n个数,表示原始数组.以下m行,每行格式为1 k或者2 i j,其中第一个数为1表示删除操作,为2表示询问操作.[输出](minmax.out)输出一行,包括两

C# TreeView 树节点:递归显示整个系统盘符文件目录及文件

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace Demo { /// <summary> /// 有关对于TreeView节点的填充的相关处理类 /// </summary> class TreeViewUtils { #region 有关将整个系统盘

java递归实现easyui树节点

1. [代码]easyui的Tree节点JSON格式 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 [{        "id":1,        "text":"Folder1",        "iconCls":"icon-save",        "chi

zTree实现删除树节点

生活中的单例 中国(China),位于东亚,是一个以华夏文明为主体.中华文化为基础,以汉族为主要民族的统一多民族国家,通用汉语.中国疆域内的各个民族统称为中华民族,龙是中华民族的象征.古老的中国凭借自身的发展依旧美丽的屹立于东方民族之林,闪耀着她动人的光彩,世界上只有一个中国,任何部分都是祖国不可分割的一部分,今天我们的设计模式就从伟大的祖国开始说起---单例模式. 详解单例模式 单例模式是什么?跟我们的祖国有着怎样的关系呢?首先我们来看一下单例,从"单例"字面意思上理解为-一个类只有

用递归删除各种节点

#include <stdio.h> #include <malloc.h> #include <stdlib.h> #define MAXSIZE 1000 typedef int ElemType; typedef struct node{ //定义链表节点类型 ElemType data; struct node * next; } Node; typedef Node *LinkedNode; /*[1] 求以h为头指针的单链表的节点个数 */ int GetN

关于递归删除链表节点为什么不会断链问题解释

问题的由来:    当你第一次实现用递归实现链表删除功能的时候,是否有一丝丝的考虑过.这个问题呢?为什么对于非递归版本的删除必须要知道当前要删除节点的前驱,而需要对其前驱节点的next域指针进行修改.而递归删除却不需要呢?难道这样不会造成链表的断链吗? 好了.我们开始抽象出我们今天要解决的问题. 问题一: 递归实现链表节点的删除和非递归删除的区别是什么? 问题二: 为什么在使用递归删除的时候链表不会断链? 先给个代码,好根据代码模拟,不会空想. 函数的递归模型: 终止条件: f(L,x) = 不

ext 树节点操作

ext 树节点操作 tree :树    node:节点 1.全部展开 tree.expandAll(); 2.全部收缩 tree.collapseAll(); 3.得到父节点 node.parentNode 4.判断是否有父节点 node.parentNode==null 5.判断是否有子节点 node.hasChildNodes() 6.获取下一级所有子节点 node.eachChild(function(child) { }) 7.获取选择的节点 tree.getSelectionMode