递归遍历树结构

该博客主要展示了如何在Java中创建一个树形数据结构,并使用Gson进行序列化。代码中定义了一个`tree1`类来表示树节点,每个节点包含ID、名称和父ID。在测试类中,创建了一组树结构的数据,并通过递归方法`getChild`填充了子节点。最后,将结果转换成JSON格式输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.example.demo.entity;

import lombok.Data;

import java.util.List;

/**
 * @description:
 * @author: leiqinghua
 * @create: 2022-11-23 16:38
 * @Version 1.0
 **/
@Data
public class tree1 {
 private String id;
 private String name;

 private String pid;

 private List<tree1> childTree1;

}

package com.example.demo;


import com.example.demo.entity.tree1;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.junit.jupiter.api.Test;
import org.junit.platform.commons.util.StringUtils;

import org.springframework.boot.test.context.SpringBootTest;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@SpringBootTest
class DemolistnerApplicationTests {

    private final Gson gson = new GsonBuilder().disableHtmlEscaping().create();
    @Test
    void contextLoads() {
        ArrayList<tree1> tree1s = new ArrayList<>();

        tree1 tree1 = new tree1();
        tree1.setId("1");
        tree1.setName("中国");
        tree1.setPid(null);
        tree1s.add(tree1);

        tree1 tree2 = new tree1();
        tree2.setId("2");
        tree2.setName("福建");
        tree2.setPid("1");
        tree1s.add(tree2);

        tree1 tree3 = new tree1();
        tree3.setId("3");
        tree3.setName("广东");
        tree3.setPid("1");
        tree1s.add(tree3);
        tree1 tree4 = new tree1();
        tree4.setId("4");
        tree4.setName("福州");
        tree4.setPid("2");
        tree1s.add(tree4);

        tree1 tree5 = new tree1();
        tree5.setId("5");
        tree5.setName("宁德");
        tree5.setPid("2");
        tree1s.add(tree5);


        tree1 tree6 = new tree1();
         tree6.setId("6");
         tree6.setName("佛山");
         tree6.setPid("3");
        tree1s.add(tree6);

        tree1 tree7 = new tree1();
        tree7.setId("7");
        tree7.setName("深圳");
        tree7.setPid("3");
        tree1s.add(tree7);

        tree1s.forEach(l ->{
            System.out.println(l);
        });


        // 最后的结果
        List<tree1> menuList = new ArrayList<tree1>();
        // 先找到所有的一级菜单
        for (int i = 0; i < tree1s.size(); i++) {
            // 一级菜单没有parentId
            if (StringUtils.isBlank(tree1s.get(i).getPid())) {
                menuList.add(tree1s.get(i));
            }
        }
        // 为一级菜单设置子菜单,getChild是递归调用的
        for (tree1 menu : menuList) {
            menu.setChildTree1(getChild(menu.getId(), tree1s));
        }
        Map<String,Object> jsonMap = new HashMap<>();
        jsonMap.put("menu", menuList);
        System.out.println(gson.toJson(jsonMap));






    }



    /**
     * 递归查找子菜单
     *
     * @param id
     *            当前菜单id
     * @param rootMenu
     *            要查找的列表
     * @return
     */
    private List<tree1> getChild(String id, List<tree1> rootMenu) {
        // 子菜单
        List<tree1> childList = new ArrayList<>();
        for (tree1 menu : rootMenu) {
            // 遍历所有节点,将父菜单id与传过来的id比较
            if (StringUtils.isNotBlank(menu.getPid())) {
                if (menu.getPid().equals(id)) {
                    childList.add(menu);
                }
            }
        }
        // 把子菜单的子菜单再循环一遍
        for (tree1 menu : childList) {// 没有url子菜单还有子菜单
            if (StringUtils.isNotBlank(menu.getPid())) {
                // 递归
                menu.setChildTree1(getChild(menu.getId(), rootMenu));
            }
        } // 递归退出条件
        if (childList.size() == 0) {
            return null;
        }
        return childList;


    }
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值