如何通过递归找父节点或子节点详解

article/2025/10/26 21:20:50

前言:如何通过递归去查询父节点或子节点,相信大家在平常肯定会遇到这样的需求,这一章我们就好好研究下如何用递归去找。

目录

一、递归找父节点或子节点

二、创建一张表关系表保存上面的关系

三、递归查询父节点或子节点核心代码

四、演示查询父节点或子节点


一、递归找父节点或子节点

1、根据下图我如何去找下图inst的父节点:inst->crlim->cust->custTotal

2、根据下图我如何去找下图cust的子节点:cust->crlim->inst、cash、instCash

 二、创建一张表关系表保存上面的关系

带着上面的疑问,我们首先先创建一张关系表,把这些关系都存到表中。

CREATE TABLE `limit_mesh` (`id` int NOT NULL AUTO_INCREMENT,`parent_node` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,`child_node` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;INSERT INTO `limit_mesh`(`id`, `parent_node`, `child_node`) VALUES (1, 'crilm', 'inst');
INSERT INTO `limit_mesh`(`id`, `parent_node`, `child_node`) VALUES (2, 'crilm', 'cash');
INSERT INTO `limit_mesh`(`id`, `parent_node`, `child_node`) VALUES (3, 'crilm', 'instCash');
INSERT INTO `limit_mesh`(`id`, `parent_node`, `child_node`) VALUES (4, 'cust', 'crilm');
INSERT INTO `limit_mesh`(`id`, `parent_node`, `child_node`) VALUES (5, 'custTotal', 'cust');
INSERT INTO `limit_mesh`(`id`, `parent_node`, `child_node`) VALUES (6, 'cust', 'splmt');
INSERT INTO `limit_mesh`(`id`, `parent_node`, `child_node`) VALUES (7, 'splmt', 'byj');
INSERT INTO `limit_mesh`(`id`, `parent_node`, `child_node`) VALUES (8, 'splmt', 'ygj');

三、递归查询父节点或子节点核心代码

其他代码这里就不详细来写了,只写我们递归的核心代码。

  • 递归查询父节点核心代码
    /*** 递归找父节点* @param nodeNo* @return*/public List<String> getLimitMeshParentList(String nodeNo) {List<String> parentList = new ArrayList<>();List<LimitMesh> limitMeshList = limitMeshService.getLimitMeshList();getParentNodeNo(limitMeshList,nodeNo,parentList);return parentList;}private List<String> getParentNodeNo(List<LimitMesh> limitMeshList,String nodeNo,List<String> parentList) {if (!parentList.contains(nodeNo)) {parentList.add(nodeNo);}List<String> parentRecursionList = getParentRecursionList(nodeNo,limitMeshList);if (CollectionUtils.isNotEmpty(parentRecursionList)) {if (!parentList.containsAll(parentRecursionList)) {parentList.addAll(parentRecursionList);}for (String str:parentRecursionList) {List<String> parentNodeNoList = getParentNodeNo(limitMeshList, str, parentList);if (!parentList.containsAll(parentNodeNoList)) {parentList.addAll(parentNodeNoList);}}}return parentList;}private List<String> getParentRecursionList(String nodeNo, List<LimitMesh> limitMeshList) {return limitMeshList.stream().filter(limitMesh -> limitMesh.getChildNode().equals(nodeNo)).map(limitMesh -> limitMesh.getParentNode()).collect(Collectors.toList());}
  • 递归查询子节点核心代码
     /*** 递归找子节点* @param nodeNo* @return*/public List<String> getLimitMeshChildList(String nodeNo) {List<String> childList = new ArrayList<>();List<LimitMesh> limitMeshList = limitMeshService.getLimitMeshList();getChildNodeNo(limitMeshList,nodeNo,childList);return childList;}private List<String> getChildNodeNo(List<LimitMesh> limitMeshList, String nodeNo, List<String> childList) {if (!childList.contains(nodeNo)) {childList.add(nodeNo);}List<String> childRecursionList = getChildRecursionList(nodeNo,limitMeshList);if (CollectionUtils.isNotEmpty(childRecursionList)) {if (!childList.containsAll(childRecursionList)) {childList.addAll(childRecursionList);}for (String str:childRecursionList) {List<String> childNodeNoList = getChildNodeNo(limitMeshList, str, childList);if (!childList.containsAll(childNodeNoList)) {childList.addAll(childNodeNoList);}}}return childList;}private List<String> getChildRecursionList(String nodeNo, List<LimitMesh> limitMeshList) {return limitMeshList.stream().filter(limitMesh -> limitMesh.getParentNode().equals(nodeNo)).map(limitMesh -> limitMesh.getChildNode()).collect(Collectors.toList());}

四、演示查询父节点或子节点

当我们查询ins父节点时候返回如图:

 当我们查询cust子节点时候返回如图:

如果大家想看完整代码移步这里:递归查询父节点或子节点


http://chatgpt.dhexx.cn/article/DZU0DKXy.shtml

相关文章

如何获取el-tree中所有节点的父节点

<el-tree ref"tree" :data"data" :props"defaultProps" node-click"handleNodeClick"></el-tree><script>import { throttle } from lodashexport default {data() {return {data: [{label: 一级 1,value: 1,childr…

DOM(三):节点操作——获取父子兄节点(查)、添加和删除元素节点

一、节点之间的层级&#xff1a;父子兄 节点主要 有父子兄关系 1.父节点操作 语法&#xff1a;子节点.parentNode&#xff0c;得到的是一个元素不是集合 比如我选了一个类名叫zzy的元素 var zzy document.querySelector(.zzy);那么要获取zzy 的父节点&#xff0c;只需要zz…

节点操作 ------------- 父节点

在获取元素时我们可以利用DOM提供的一系列方法获取&#xff0c;但是这些方法过于繁琐&#xff0c;不简练。所以我们学习节点操作&#xff0c;页面中所有内容都是节点&#xff0c;有文档节点&#xff0c;元素节点&#xff0c;属性节点等&#xff0c;我们主要针对研究的是元素节点…

dom获取节点(子节点、兄弟节点、父节点)

今天在做一个项目拿兄弟节点的事&#xff0c;刚开始拿不到&#xff0c;后来网上查了一下&#xff0c;于是 便找到方法了&#xff0c;下面把我的问题写出来&#xff0c;话不多说直接上问题&#xff0c; 遇到的问题是我要通过点击删除按钮删除这一行数据&#xff0c;后端给的接口…

# 如何获取父节点和子节点

文章目录 一、获取父级节点二、获取子节点1、获取子节点2、获取指定子节点 三、总结 一、获取父级节点 node.parentNode 代码如下&#xff08;示例&#xff09;&#xff1a; <!DOCTYPE html> <head>父节点操作</head> <body><div class"box&q…

JS节点操作(1) - 父节点,子节点,兄弟节点

节点操作的作用 获取元素通常使用的两种方式&#xff1a; 1. 利用DOM提供的方法获取元素 document.getElementById()document.getElementsByTagName()document.querySelector() 等等逻辑性不强&#xff0c;繁琐 2. 利用节点层级关系获取元素 利用父子兄弟节点关系获取元素…

树中的重要概念

1 基本术语及定义 1.1 根节点 根节点&#xff1a;是树中唯一没有入边的节点。 1.2 父节点 父节点&#xff1a;一个节点是其所有子节点的父节点 1.3 子节点 子节点&#xff1a;一个节点通过出边与子节点相连 1.4 兄弟节点 兄弟节点&#xff1a;具有同一个父节点的节点称…

VScode 代码注释

MAC&#xff1a; 单行注释/取消注释&#xff1a; command/ 多行注释/取消注释&#xff1a; 1.选中要注释代码块command/ 2.optionshifta 3.JsDOc注释&#xff1a;/tab** 如下图所示 常用于给方法写注释&#xff0c;写在方法上时会自动带上此方法的参数&#xff0c;而且会车自…

说说代码中的注释

*what&#xff1a; 注释&#xff0c;也是解释&#xff0c;标记。代码中的注释不会被执行&#xff01; *why&#xff1a; 方便提醒自己&#xff0c;这代码代表的是什么功能&#xff1f;当代码量很大的时候&#xff0c;非常有用。 当然&#xff0c;平时写代码就得规范&#x…

3、代码注释与编码规范

目录 一、代码注释 &#xff08;1&#xff09;单行注释 &#xff08;2&#xff09;多行注释 &#xff08;3&#xff09;文档注释 2. 编码规范 一、代码注释 &#xff08;1&#xff09;单行注释 “//”为单行注释标记&#xff0c;从符号“//”开始直到换行为止的所有内容…

关于如何优雅的做好代码注释

问题思考 作为研发同学&#xff0c;对于代码“注释”其实并不陌生。它往往作为我们代码文档的特殊补充而存在。 其实在代码文档中&#xff0c;起主要作用的因素并非注释&#xff0c;而是好的编程风格。 编程风格包括&#xff1a;良好的程序结构、易于理解的方法、有意义的变量…

VS Code - 自动生成代码注释

目录 1. 代码注释 2. 插件安装 3. 使用示例 1. 代码注释 代码注释在软件的迭代过程中举足轻重&#xff0c;所以一个规范化的代码注释也非常重要&#xff0c;在用 VS Code 中则可以使用插件来规范化代码注释。 autoDocstring: VSCode Python Docstring Generator GitHub - N…

python中如何注释代码

1、python中通过#来注释单行不需要运行的代码&#xff0c;如&#xff1a; 此时&#xff0c;被注释代码变灰色了&#xff0c;那么在执行程序时&#xff0c;该行代码就不会被运行了 2、注释多行代码用xxxxx或者"""xxxx"""来注释&#xff0c;作用同…

python 代码注释

文章目录 写在前面使用方法plainEpytextGoogleNumpyreStructuredText相关程序包其他 写在前面 如果说高效率的算法是一个项目的内核&#xff0c;那么完备的文档注释、API 接口则是项目的外壳&#xff0c;直接与客户交互。 pycharm 提供了 5 种 代码注释格式。 分别是 plain, e…

谈代码注释

只要写代码&#xff0c;就会遇到代码注释的问题。在不同的公司&#xff0c;不同的项目组&#xff0c;不同的项目中&#xff0c;可能会有不同的注释标准。有些标准让我们感觉很受益&#xff0c;有些则让我们感觉很反感。而对于没有明确标准的项目&#xff0c;我们往往会遇到“百…

教你写好代码注释

前言 相信大家都会遇到这种情况&#xff1a;一周前自己写的代码&#xff0c;现在再拿出来看&#xff0c;发现读不懂了&#xff0c;“ 这代码是我写的&#xff1f;&#xff1f;&#xff1f;”。这时候&#xff0c;代码注释就可以发挥它的作用了——提高晦涩难懂的代码的可读性&…

关于代码的注释的几种方法

注释就是对代码的解释和说明&#xff0c;其目的是让人们能够更加轻松地了解代码。注释是编写程序时&#xff0c;写程序的人给一个语句、程序段、函数等的解释或提示&#xff0c;能提高程序代码的可读性。注释只是为了提高可读性&#xff0c;不会被计算机编译。 注释一般分为行注…

C++设计模式之观察者模式和发布订阅模式

在软件工程中&#xff0c;设计模式&#xff08;Design Pattern&#xff09;是对软件设计普遍存在&#xff08;反复出现&#xff09;的各种问题&#xff0c;锁提出的解决防范。根据模式的目的来划分的话&#xff0c;GoF&#xff08;Gang of Four&#xff09; 设计模式可以分为以…

Redis发布订阅模式实现原理

前言 发布订阅系统在我们日常的工作中经常会使用到&#xff0c;这种场景大部分情况我们都是使用消息队列&#xff0c;常用的消息队列有 Kafka&#xff0c;RocketMQ&#xff0c;RabbitMQ&#xff0c;每一种消息队列都有其特性&#xff0c;很多时候我们可能不需要独立部署相应的消…

RabbitMQ入门案例之发布订阅模式

前言 本文章主要介绍RabbitMQ的发布订阅模式&#xff0c;该模式下&#xff0c;消息为广播形式&#xff0c;一经发布则会进入交换机绑定的队列中&#xff0c;详细介绍可以阅读官方文档。 官网文档地址&#xff1a;https://rabbitmq.com/getstarted.html 什么是发布与订阅模式 …