当前位置: 首页 > news >正文

【数据结构和算法】--N叉树中,返回某些目标节点到根节点的所有路径

目录

  • 一、前言
  • 二、具体实现及拓展
    • 2.1、递归-目标节点到根节点的路径数据
    • 2.2、list转换为tree结构
    • 2.3、tree转换为list结构

一、前言

这么多年工作经历中,“数据结构和算法”真的是超重要,工作中很多业务都能抽象成某种数据结构问题。下面是项目中遇到的一个问题。
业务背景:
在一个复杂的N叉树目录上,通过模糊搜索只返回搜索到的【要返回完整的从root到目标节点】节点链路,以便外围系统直接使用
分析:
按照实际操作,模糊搜索只能搜索到需要的几个目标节点数据,但实际业务需要的是这些目标节点到根节点的结构,以便完美展示。
在这里插入图片描述

问题抽象:
N叉树中,找到所有目标节点到根节点的数据,并构建成tree结构返回。如下图,要返回这些目标节点到根节点的整个路径上的节点数据。
在这里插入图片描述

二、具体实现及拓展

完整的代码如下

 public void filterNodeFromTree(){//查询所有的【"有树形结构的"】列表数据List<NodeTreeDo> originList = new ArrayList<>();Map<String,NodeTreeDo> originMap = originList.stream().collect(Collectors.toMap(NodeTreeDo::getId,ma->ma));//目标节点idList<String> targetIds = new ArrayList<>();Set<String> curRootIdSet = new HashSet<>(); //收集某个目标节点到root的路径经过的所有节点for(String id : targetIds){if(curRootIdSet.contains(id)) continue;//已经经历过路径,跳过curRootIdSet.addAll(collectNeedNode(originMap,id));}//收集到所有需要的节点的id,然后在过滤多余的List<NodeTreeDo> needList = originList.stream().filter(k->curRootIdSet.contains(k.getId())).collect(Collectors.toList());//构建成treelistToTree(needList);}

2.1、递归-目标节点到根节点的路径数据

private Set<String> collectNeedNode(Map<String,NodeTreeDo> originMap,String targetId){Set<String> idResultSet = new HashSet<>();collectNeedNode(originMap,targetId,idResultSet);return idResultSet;}private boolean collectNeedNode(Map<String,NodeTreeDo> originMap,String targetId,Set<String> idSet){if(!originMap.containsKey(targetId)) return false;idSet.add(targetId);NodeTreeDo cur = originMap.get(targetId);return collectNeedNode(originMap,cur.getParentId(),idSet);}

2.2、list转换为tree结构

    private List<NodeTreeDo> listToTree(List<NodeTreeDo> originList){Map<String, List<NodeTreeDo>> nodeByPidMap = originList.stream().collect(Collectors.groupingBy(NodeTreeDo::getParentId));// 循环一次设置当前节点的子节点originList.forEach(node -> node.setChildren(nodeByPidMap.get(node.getId())));// 获取 一级列表return originList.stream().filter(k->"".equals(k.getParentId())).collect(Collectors.toList());}

2.3、tree转换为list结构

  private List<NodeTreeDo> treeToList(List<NodeTreeDo> treeList){List<NodeTreeDo> resultList = new ArrayList<>();for(NodeTreeDo node : treeList){getAllListFromChildren(node,resultList);}return resultList;}private void getAllListFromChildren(NodeTreeDo node,List<NodeTreeDo> resultList){NodeTreeDo copy = CommonUtil.transForm(node,NodeTreeDo.class);copy.setChildren(null); //深度拷贝后,把children设置为nullresultList.add(copy);if(CollectionUtils.isNotEmpty(node.getChildren())){for(NodeTreeDo temp : node.getChildren()){getAllListFromChildren(temp,resultList);}}//没子节点了,自动会退出}
http://www.lryc.cn/news/181170.html

相关文章:

  • 进程和线程的区别 线程之间共享的资源
  • 基于Matlab实现logistic方法(源码+数据)
  • leetCode 121. 买卖股票的最佳时机 贪心算法
  • 《Oracle系列》Oracle 索引使用情况查看
  • 解决Invalid bound statement (not found)错误~
  • 基于SpringBoot的反诈宣传平台设计与实现(源码+lw+部署文档+讲解等)
  • 【改进哈里鹰算法(NCHHO)】使用混沌和非线性控制参数来提高哈里鹰算法的优化性能,解决车联网相关的路由问题(Matlab代码实现)
  • 【C语言】宏定义
  • 库存三层模型概述
  • SNERT预备队招新CTF体验赛-Web(SWCTF)
  • OpenGLES:绘制一个彩色、旋转的3D圆柱
  • 【QT开发(6)】0926-QT 中加入 fastDDS 通信库的程序使用说明
  • js 判断字符串中是否包含某个字符串
  • 部署在阿里云ECS服务器上的微服务项目中获取到的时间和windows的时间不一样的问题
  • 怎么通过portainer部署一个vue项目
  • Springboot实现websocket(连接前jwt验证token)
  • 2023/10/3
  • zemax场曲/畸变图与网格畸变图
  • 【小尘送书-第六期】《巧用ChatGPT轻松玩转新媒体运营》AI赋能运营全流程,帮你弯道超车、轻松攀登运营之巅
  • GD32F10 串口通信
  • QT常用控件介绍
  • [FineReport]安装与使用(连接Hive3.1.2)
  • 黑马mysql教程笔记(mysql8教程)基础篇——数据库相关概念、mysql安装及卸载、数据模型、SQL通用语法及分类(DDL、DML、DQL、DCL)
  • 最新AI智能创作系统源码V2.6.2/AI绘画系统/支持GPT联网提问/支持Prompt应用
  • 神器 CodeWhisperer
  • GraphQL全面深度讲解
  • 9.1 链表
  • 分布式文件系统FastDFS实战
  • 手机自动直播系统源码交付与代理加盟注意事项解析!
  • NodeJS 如何连接 MongoDB