递归树实现 Java

java树形结构递归实现 【代码】java树形结构代码实现。 阅读详情

前言

        不管是传统项目还是互联网电商项目,都会用到递归调用,比如传统的部门  等级,或者说商品的菜单目录,递归是循环调用,
    自己调用自己,两个问题比较明显,一个是效率问题,一个是一不小心就会导致OOM(Out Of  Memory)

思路

      递归分两种,一个是内存递归,一个是数据库递归,当然练习时,可以两种都写写比较一下,但是不用多说内存的效率那是没得说,
   接下来咱们就用代码实现一个递归

代码

/**
 * 实体类
 * @Classname Recursion
 * @Created by windBird
 */
public class Recursion implements Serializable {

    private static final long serialVersionUID = -8285127290179079661L;
  
    private   Integer  id; // 主键

    private  Integer pid;  //父id  与主键关联

    private  Integer icon; //递归对应的图标

    private Integer seq; //递归对应的顺序

    private Integer level;//递归的等级

    private String  title;  //显示的内容

    private List<Recursion> childrenList; //子类

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getPid() {
        return pid;
    }

    public void setPid(Integer pid) {
        this.pid = pid;
    }

    public Integer getIcon() {
        return icon;
    }

    public void setIcon(Integer icon) {
        this.icon = icon;
    }

    public Integer getSeq() {
        return seq;
    }

    public void setSeq(Integer seq) {
        this.seq = seq;
    }

    public Integer getLevel() {
        return level;
    }

    public void setLevel(Integer level) {
        this.level = level;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public List<Recursion> getChildrenList() {
        return childrenList;
    }

    public void setChildrenList(List<Recursion> childrenList) {
        this.childrenList = childrenList;
    }
}

统计递归关联次数
select 
t.id,
t.pid,t.name,
sum(case when t.id =n.name_id then 1 else 0 end) as total   from tb_name t 
left join tb_name_shop n on t.id =n.name_id
group by t.id
################ 具体书写##################
/**
 * @Description  具体实现
 * @Date 2020/11/28 11:02
 * @Created by windBird
 */
public class RecursionPractise {
    public static void main(String[] args) {
        List<Recursion> resultData = new ArrayList<>(); //最终返回的结果
        List<Recursion> recursions = new ArrayList<>(); //递归的单个对象
        getData(recursions);
        //递归树逻辑编写 
        resultData = recursions.stream().filter(recursion -> recursion.getPid() == -1)
                .map(recursion -> covertRecursionCode(recursion, recursions)).collect(Collectors.toList());

        resultData.forEach(r-> System.out.println("r = " + r));
    }

    private static Recursion covertRecursionCode(Recursion recursion, List<Recursion> recursions) {
        Recursion node = new Recursion();
        BeanUtils.copyProperties(recursion,node);
        List<Recursion> childNode = recursions.stream().filter(childrenRecursion -> childrenRecursion.getPid() == recursion.getId())
                .map(childrenRecursion -> covertRecursionCode(childrenRecursion, recursions)).collect(Collectors.toList());
        node.setChildrenList(childNode);
        return node;
    };

    public static void getData(List<Recursion> recursions) {
        //查询数据库获取数据 这里自己构造
        Recursion recursion = new Recursion();
        recursion.setId(1);
        recursion.setPid(-1);
        recursion.setIcon(1);
        recursion.setTitle("递归树顶层");
        recursion.setLevel(1);
        recursion.setSeq(0);
        recursions.add(recursion);
        Recursion recursion1 = new Recursion();
        recursion1.setId(2);
        recursion1.setPid(1);
        recursion1.setIcon(2);
        recursion1.setTitle("递归树次顶层");
        recursion1.setLevel(2);
        recursion1.setSeq(1);
        recursions.add(recursion1);
        Recursion recursion2 = new Recursion();
        recursion2.setId(3);
        recursion2.setPid(1);
        recursion2.setIcon(1);
        recursion2.setTitle("递归树次顶层");
        recursion2.setLevel(2);
        recursion2.setSeq(2);
        recursions.add(recursion2);

        Recursion recursion3 = new Recursion();
        recursion3.setId(4);
        recursion3.setPid(2);
        recursion3.setIcon(1);
        recursion3.setTitle("递归树次次顶层");
        recursion3.setLevel(3);
        recursion3.setSeq(0);
        recursions.add(recursion3);
    }
}

### 树转集合
 private static List<Recursion> treeToList(List<Recursion> messageList) {
        List<Recursion> result = new ArrayList<>();
        messageList.forEach(m->{
            result.add(m);
            List<Recursion> childrenList = m.getChildrenList();
            if(!CollectionUtils.isEmpty(childrenList)){
                List<Recursion> childrenListAgain = treeToList(childrenList);
                result.addAll(childrenListAgain);
            }
        });
        if(result.size() > 0) result.forEach(r-> r.setChildrenList(null));
        return result;
    }

结果展示

递归树顶级

二级

二级展现
3级展现

友情提示

1.靠内存实现递归,减少与数据库的磁盘交互
2.表设计的关键,id 与p_id 需要自关联,其他字段根据项目需要添加
3.实体类的设计,必须有List <XXX> 集合节点
4.自己指定一个根节点的标记,比如 p_id 给个 -1

Java递归遍历树的实现与应用 树的遍历分为前序遍历、中序遍历和后序遍历。这些遍历方法对应于访问节点和子节点的顺序不同。前序遍历先访问根节点,然后是子节点;中序遍历先访问左子树,然后是根节点,最后是右子树;后序遍历则是先访问子节点,最后访问根节点。// 树遍历的方法签名示例// 先访问节点,再递归遍历子节点// 先递归遍历左子树,然后访问节点,最后递归遍历右子树// 先递归遍历子节点,最后访问节点这些方法的具体实现将在下一章详细讨论。 阅读详情

相关推荐

QQ的TEA填充算法C#实现 By Red_angelX

注:本人只是从LUMA QQ的 Source Code里面把相应Java语言翻译成C#,纯技术研究,并没有对TC产品做任何逆向分析,不承担任何法律责任!转载请保持本文完整性网上有c/c++,vb,delphi,java,perl各种版本的tea填充算法,唯独没有C#的,这让我这种狂热喜爱C#的人如何承受,于是,花3天时间看了各种代码经历无数失败的挫折终于用C#完成了该填充算法,废话不多说,直接

Red_angelX的专栏 1万+

java递归实现树形结构数据

java递归实现树形结构数据

陈小翔的博客 1万+

opencv去除印章痕迹

今天看到一个很有意思的程序,就是去除票据上的红色印章,觉得很有意思,就把它抄过来记录一下,同时自己也开了一下脑洞。 原来的程序来自:https://www.cnblogs.com/skyfsm/p/7638301.html 可以看到图像效果很不错,下面是源码实现: #include &lt;iostream&gt; #include &lt;opencv2/imgproc/imgpro...

zeng_haoyu的博客 7961

Java递归实现树形结构的两种方式

Java递归实现树形结构的两种常见方式。

一宿君 1万+

离散数学 --- 图论基础 --- 图的同构,通路与回路,可达性与最短通路

同一个图(这里的图是抽象的数学定义)可以有不同的图形表示方法1.重数:两点之间的平行边的个数1.得到 n!的过程,一个图中的一个结点在另一个图中对应的结点有n种可能(黄框中定义的图来讨论),这个对应好后下一个结点有 n - 1 种可能,再下一个有n-2种,直到最后一个为1,所有可能的结果就等于 n * (n - 1) *(n - 2)*....*1 = n!2.虽然说找对应结点很困难,但不是没有规律可循的。比如1.两个相互对应的结点的度数要相同;

qq_51947882的博客 7443

从频谱分析到硬件加速:用ZYNQ-7020+FFT IP核实现实时信号处理的完整方案

本文详细介绍了如何利用ZYNQ-7020和FFT IP核实现实时信号处理的完整方案,涵盖系统架构设计、硬件加速实现及性能优化。通过异构计算架构,该方案将1024点FFT处理延迟压缩至28μs,显著提升工业自动化和无线通信等领域的实时频谱分析效率。

weixin_33704234的博客 469

Java递归实现树结构(包含Java 8 方法)

递归实现树结构数据 一、递归概念:自己的理解,自己调用自己,何为自己钓鱼呢自己,比如 下面的**chilMenus.add(buildChilTree(menuNode))**就是在自己调用自己,查询到下一级的下一级,有几级我就调用几次我自己,从而实现树状结构中的父节点下的所有子级。 //递归,建立子树形结构 public Menu buildChilTree(Menu pNode){ List<Menu> chilMenus =new ArrayList<Menu>();

Blooming death的博客 2万+

MobileViT替换YOLOv11主干网络:轻量化新思路-(用MobileViT等轻量视觉Transformer降低计算成本)

在计算机视觉领域,目标检测一直是核心任务之一,而YOLO(You Only Look Once)系列算法因其出色的速度-精度平衡成为工业界和学术界的热门选择。随着YOLOv11的推出,模型性能达到了新的高度,但其计算复杂度和参数量也随之增加,这对资源受限的移动设备和嵌入式系统提出了挑战。与此同时,视觉Transformer(ViT)的出现为计算机视觉带来了全新范式,但其庞大的计算需求限制了在移动端的应用。MobileViT作为一种创新的轻量级视觉Transformer架构,巧妙结合了CNN的归纳偏置优势和V

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1648

JAVA递归实现树形结构

递归实现树形结构

weixin_48911650的博客 904

华为OD机试真题 新系统 9月16号 【园区基站节能部署规划】

华为OD机试真题 新系统【园区基站节能部署规划】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【园区基站节能部署规划】多语言题解。

qq_45776114的博客 361

Unity之Timeline教程

Unity Timeline是Unity的一种时间轴编辑器工具,用于制作和管理游戏中的动画、剧情以及事件触发。它提供了直观的界面,使得开发者可以通过拖放操作轻松创建和编辑时间轴。Activation Track:用于控制物体的激活状态。可以在轨道上添加关键帧,控制物体的激活和非激活状态。Animation Track:用于处理物体的动画。可以在此轨道上添加关键帧,编辑物体的动画状态。Audio Track:用于处理场景中的音频。可以管理音频的播放、暂停、淡入淡出等操作。

TxNet 9446

创建递归树 Java

老规矩,没什么解释的,需要递归树,那就代码实现: public static List createTree(String code,List<MenusVO> menus){ List tree = new ArrayList<>(); for(int i =0;i<menus.size();i++){ MenusVO vo = menus.get(i); if(vo.getParentCode().equal(code)){

涵山韵海的博客 177

【图像去噪】论文精读:Restormer: Efficient Transformer for High-Resolution Image Restoration

论文题目:Restormer: Efficient Transformer for High-Resolution Image Restoration —— Restormer:用于高分辨率图像恢复的高效变压器高效Transformer模型用于图像恢复!由于卷积神经网络 (CNN) 在从大规模数据中学习可泛化的图像先验方面表现良好,因此这些模型已广泛应用于图像恢复和相关任务。最近,另一类神经架构 Transformer 在自然语言和高级视觉任务中显示出显着的性能提升。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1526

java递归树_java利用递归调用实现树形菜单的样式

一:需求现有以需求就是把某一个帖子的全部评论展示出来。二:分析关于对帖子的评论分为主评论和子评论,主评论就是对帖子的直接评论,子评论就是对评论的评论。三:思路先获取某一个帖子的全部主评论,递归判断是否有子评论,获取子评论。递归本质:程序调用自身的编程技巧叫做递归。程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接...

weixin_39910963的博客 315

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java创建递归树

什么是递归树 如果我们把这个一层一层的分解过程画成图,它其实就是一棵树。我们给这棵树起一个名字,叫作递归树。 JSON格式结果 [ { "children": [ { "children": [ { "children": [ ], "id": "GN001D110", "parentId": "GN001D100",

臆想的一只猫 433

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

关于两个表的递归树查询-_-

递归树。

F2D2B2E的博客 359

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【JAVA秒会技术之搞定数据库递归树】Mysql快速实现递归树状查询

Mysql快速实现递归树状查询 【前言】今天一个好朋友问我的这个问题,以前也没有用到过,恰好有时间,就帮他研究了一下,纯属“现学现卖”,正好在过程中,自己也能学习一下!个人感觉,其实一点也不难,不过是“闻道有先后”,我们是“后”罢了。按照我的习惯,学完东西,总要总结一下嘛,也当做一个备忘录了。   具体需求就不描述了,简而言之,归结为两个: 1.如何通过子节点(cid)加载出所有的父节点(

qq296398300的博客 4650

递归树列表

【代码】递归树列表。

sunian123123的博客 171

java递归树反向统计_通过java递归思想实现以树形方式展现出该目录中的所有子目录和文件...

import java.io.File;public class FileTest2{publicstaticintcount=0;publicstaticvoidparse(File[]files){if(files.length==0){FileTest2.count--;System.out.println();return;}else{...

weixin_35915828的博客 402

简单的递归树分类查询

java递归查询

我的java小屋有点乱 297

Leetcode 17题 回溯深搜

建议将递归树画出来,并用全局变量保存结果,比较清晰 import java.util.ArrayList; import java.util.List; public class Solution { String[] phoneNumber = { "","","abc","def", "ghi","jkl","mno", "pqrs","tuv","wxyz", }; List<String&

wwxy1995的博客 425

全排列问题(LeetCode 46 & 47)

本篇文章主要介绍了全排列问题以及详细的解法。给定一个数组求出其中的全排列。其中的数组,可能带重复元素,也可能不带重复元素。有详细思路以及递归树图解,语言包括C++Java和Go。下面先来看看简单的版本,不带重复元素的。

氷泠 722

leetcode22. 括号生成

leetcode22. 括号生成 题目:给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。 例如,给出 n = 3,生成结果为: [ “((()))”, “(()())”, “(())()”, “()(())”, “()()()” ] 分枝限界法。 其实就是一个dfs的递归树 由于字符串只有左括号和右括号两种字符,而且最终结果必定是左括号3个,右括号3个,所...

lonelyVM的博客 178

递归的层序遍历&&dfs深度遍历

递归的层序遍历

m0_37635053的博客 430

《算法导论》-分治策略,分治排序(Java,C++)

简单的来说就是将原问题分解为规模较小的子问题,几个规模较小的子问题类似于原问题,递归的求解子问题,将子问题合并,建立原问题的解。

qq_44242804的博客 421
上一篇: execution使用
下一篇: Idea 搜索快捷键
WindwardBird
博客等级 码龄7年 19粉丝 94原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值