首页 > 其他分享 >向下递归以及向上递归

向下递归以及向上递归

时间:2022-11-22 11:57:13浏览次数:36  
标签:递归 Recursion list item add new 向下 向上 List

结果以json格式输出,可以用json在线解析,方便查看

package com.xintone.demo;

import cn.hutool.json.JSONUtil;
import lombok.Data;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Data
public class Recursion {
    // 主键id
    private Integer id;
    // 父级id
    private Integer parentId;
    // 子集
    private List<Recursion> children;
    // 层级
    private Integer level;

    public Recursion(Integer id, Integer parentId) {
        this.id = id;
        this.parentId = parentId;
    }

    public static void main(String[] args) {
        // 获取测试数据
        List<Recursion> recursions1 = getList();
        // 获取顶级父集
        List<Recursion> parents = recursions1.stream().filter(item -> item.getParentId().equals(0)).collect(Collectors.toList());
        // 设置层级
        parents.forEach(item -> item.setLevel(0));
        // 向下递归
        downwardRecursion(parents, recursions1);
        System.out.println("向下递归:" + JSONUtil.toJsonStr(parents));

        System.out.println("-------------分割线-------------");
        // 获取测试数据
        List<Recursion> recursions2 = getList();
        // 获取测试数据中所有的 parentId
        List<Integer> parentIds = recursions2.stream().map(Recursion::getParentId).collect(Collectors.toList());
        // 判断 id 是否在 parentIds 中,不在则是最子级
        List<Recursion> children = recursions2.stream().filter(item -> !parentIds.contains(item.getId())).collect(Collectors.toList());
        // 向上递归
        upwardRecursion(children, recursions2);
        // 递归完从测试数据中筛选出最顶级
        List<Recursion> tree = recursions2.stream().filter(item -> item.getParentId().equals(0)).collect(Collectors.toList());
        System.out.println("向上递归:" + JSONUtil.toJsonStr(tree));
    }

    private static void upwardRecursion(List<Recursion> children, List<Recursion> all) {
        // 遍历子集
        children.forEach(child -> {
            // 获取该子级的父级
            Recursion parent = all.stream().filter(item -> child.getParentId().equals(item.getId())).findFirst().orElse(null);
            // 判断父级是否为空,如果为空则是最顶级
            if (parent != null) {
                // 判断父级的子集是否为空
                if (parent.getChildren() == null) {
                    // 新建一个集合将子级添加到父级的子集中
                    parent.setChildren(new ArrayList<Recursion>() {{
                        add(child);
                    }});
                    // 判断该子级是否在父级的子集中存在
                    // 因为在遍历子级时,会出现多个子级的父级相同,如果不加判断会导致数据重复
                } else if (!parent.getChildren().contains(child)) {
                    // 将该子级添加到父级的子集中
                    parent.getChildren().add(child);
                }
                // 将父级添加到集合并向上递归
                upwardRecursion(new ArrayList<Recursion>() {{
                    add(parent);
                }}, all);
                child.setLevel(parent.getLevel() + 1);
            } else {
                child.setLevel(0);
            }
        });
    }

    private static void downwardRecursion(List<Recursion> parents, List<Recursion> all) {
        // 遍历父集
        parents.forEach(recursion -> {
            // 获取该父级的子集
            List<Recursion> children = all.stream().filter(item -> item.getParentId().equals(recursion.getId())).collect(Collectors.toList());
            // 判断子集是否为空
            if (!CollectionUtils.isEmpty(children)) {
                // 设置子集的层级
                children.forEach(item -> item.setLevel(recursion.getLevel() + 1));
                // 将子集添加到该父级的子集去
                recursion.setChildren(children);
                // 向下递归
                downwardRecursion(children, all);
            }
        });
    }

    private static List<Recursion> getList() {
        List<Recursion> list = new ArrayList<>();
        list.add(new Recursion(1, 0));
        list.add(new Recursion(2, 0));
        list.add(new Recursion(3, 0));
        list.add(new Recursion(4, 1));
        list.add(new Recursion(5, 1));
        list.add(new Recursion(6, 2));
        list.add(new Recursion(7, 2));
        list.add(new Recursion(8, 3));
        list.add(new Recursion(9, 3));
        list.add(new Recursion(10, 4));
        list.add(new Recursion(11, 4));
        list.add(new Recursion(12, 5));
        list.add(new Recursion(13, 5));
        list.add(new Recursion(14, 6));
        list.add(new Recursion(15, 6));
        list.add(new Recursion(16, 7));
        list.add(new Recursion(17, 7));
        list.add(new Recursion(18, 8));
        list.add(new Recursion(19, 8));
        list.add(new Recursion(20, 9));
        list.add(new Recursion(21, 9));
        return list;
    }
}

标签:递归,Recursion,list,item,add,new,向下,向上,List
From: https://www.cnblogs.com/zhimi/p/16914681.html

相关文章

  • 递归:先递进,再回归
    您好,我是湘王,这是我的51CTO博客,欢迎您来,欢迎您再来~虽然高端的知识要用最朴素有趣的方式来表达才更容易让人接受,但有些专业的内容却不能有半点马虎,必须严肃对待。后续的内容......
  • 道长的算法笔记:树结构递归模型
    (一)线性结构的递归模型链表是一种天然带有递归性质的结构,当我们想要处理\(Node_A\)为首的链表,我们尝试处理\(Node_B\)为首的链表,然后再单独处理节点\(A\),类似的,......
  • 二叉树交换左右子树递归以及非递归算法
    递归方式基本思想:1、当待处理节点非空时,判断其左右孩子是否不同时为空:若是,转到2、否则分别递归调用左右子树进行操作。2、新建一个辅助结点,执行交换操作。3、递归调用......
  • 递归删除大于30天的旧日志
    /***递归删除大于30天的旧日志*/privatestaticvoiddeleteOldLogFiles(Filedir){if(dir.isDirectory()){File[]files=dir.lis......
  • Leetcode 799.香槟塔:动态规划+递归
    香槟塔:动态规划+递归题目来源:Leetcode22/11/20每日一题:799.香槟塔https://leetcode.cn/problems/champagne-tower我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻......
  • 利用递归求两个数的最大公约数
    #include<stdio.h>inthcf(intn1,intn2);intmain(){intn1,n2;printf("输入两个正整数:");scanf("%d%d",&n1,&n2);printf("%d和%d的最大公约数......
  • 逆向递归加正向递归,将无规则树 重建成一棵完整的树
    逆向递归加正向递归,将无规则树重建成一棵完整的树背景后台在一个部门树上任意勾选,然后前端需要知道勾选后重新生成的树,没有父级的找上级依次类推。最近递归写的......
  • 82:递归函数_阶乘计算案例
    【操作】使用递归函数计算阶乘(factorial)deffactorial(n):ifn==1:return1returnn*factorial(n-1)foriinrange(1,6):print(i,......
  • 81:递归函数_函数调用内存分析_栈帧的创建
    ###递归函数递归函数指的是:自己调用自己的函数,在函数体内部直接或间接的自己调用自己。递归类似于大家中学数学学习过的“数学归纳法”。每个递归函数必须包含两个部分:1.......
  • 337. 打家劫舍 III ----- 动态规划、递归、剪枝、分类讨论
    小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到......