使用递归的方式返回一个树形结构

关于树形结构可参考我写的其他几篇文章:

1) 返回树形结构

2) 树形结构 之通过父节点查询出所有的子节点 ,通过子节点查询出所有的父节点

 

何为递归?

递归函数即自调用函数,在函数体内直接或间接的调用自己。

递归的坏处:

非必须的时候,不要使用递归,对与比较父子节点比较深的节点也不建议使用递归,因为对于堆栈消耗比较大。

如何实现递归?

package com.test.test;

import com.test.vo.MenuVo;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * @Author tanghh
 * @Date 2020/7/23 10:22
 */
public class MenuTest {
    public static void main(String[]args){
        List<MenuVo> voList = new ArrayList<>();
        MenuVo vo1 = new MenuVo(1,0,"菜单1","one");
        MenuVo vo2 = new MenuVo(2,1,"菜单2","two");
        MenuVo vo3 = new MenuVo(3,2,"菜单2-2","two-two");
        MenuVo vo4 = new MenuVo(4,1,"菜单3","three");
        MenuVo vo5 = new MenuVo(5,4,"菜单3-3","three-three");
        MenuVo vo6 = new MenuVo(6,0,"菜单4","four");
        voList.add(vo1);
        voList.add(vo2);
        voList.add(vo3);
        voList.add(vo4);
        voList.add(vo5);
        voList.add(vo6);

        //递归父子节点树形关系
        List<MenuVo> resultList = MenuTest.parseMenuTree(voList);
        System.out.println(resultList);


    }

    /**
     * @param list 数据库里面获取到的全量菜单列表
     * @return
     */
    public static List<MenuVo> parseMenuTree(List<MenuVo> list) {
        List<MenuVo> result = new ArrayList<MenuVo>();

        // 1、获取第一级节点
        for (MenuVo content : list) {
            if (0 == content.getParentId()) {
                result.add(content);
            }
        }

        // 2、递归获取子节点
        for (MenuVo contentVo : result) {
            recursiveMenuTree(contentVo,list);
        }
        return result;
    }

    /**
     * 获取节点及其子节点返回对象
     *
     * @param parent
     * @param list
     * @return
     */
    public static void recursiveMenuTree(MenuVo parent,List<MenuVo> list) {
        List childList = new ArrayList();
        for (MenuVo child : list) {
            if (Objects.equals(parent.getId(), child.getParentId())) {
                recursiveMenuTree(child,list);
                childList.add(child);
                parent.setChildren(childList);
            }
        }
    }





}

 

效果图如下:

涉及的代码:

package com.test.vo;

import java.util.List;

/**
 * @Author tanghh
 * @Date 2020/7/23 10:18
 */
public class MenuVo {
    private Integer id;
    private Integer parentId;
    private String name;
    private String type;
    private List children;
    public MenuVo() {
    }

    public MenuVo(Integer id, Integer parentId, String name, String type) {
        this.id = id;
        this.parentId = parentId;
        this.name = name;
        this.type = type;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Integer getParentId() {
        return parentId;
    }

    public void setParentId(Integer parentId) {
        this.parentId = parentId;
    }

    public List getChildren() {
        return children;
    }

    public void setChildren(List children) {
        this.children = children;
    }
}

小编技术还有待加强,大神勿喷,谢谢。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值