递归的层序遍历

本文介绍了如何在Java中通过递归方法实现对一颗递归树进行层序遍历,使用User类表示节点,并利用Map数据结构存储每层节点信息。代码展示了构建用户对象、定义递归函数以及遍历结果输出的过程。
摘要由CSDN通过智能技术生成

最近遇到一个业务需求:一颗依赖树,其实就是一颗递归树,如何一层一层的数据放在一起,可以近似理解为二叉树的层序遍历。

业务理解为递归树的层序遍历
在这里插入图片描述

代码示例:

public class RecursionErgodic {

    public static void main(String[] args) {

        User user = buildUser();
        System.out.println(user);

        Map<Integer, List<String>> map = new HashMap<>();
        int index = 1;
        List<User> childRen = user.getChildRen();
        List<String> list = new ArrayList<>();
        list.add(user.getName());
        map.put(index, list);
        cfsTraversal(childRen, map, index + 1);
        System.out.println(map);
    }

    private static void cfsTraversal(List<User> childRen, Map<Integer, List<String>> map, int index) {

        if (childRen == null) {
            return;
        }
        int size = childRen.size();
        for (int i = 0; i < size; i++) {
            User user = childRen.get(i);

            List<String> list = map.get(index);
            if (list == null) {
                list = new ArrayList<>();
            }
            list.add(user.getName());
            map.put(index, list);
            //特别注意:递归 这里不要改变index本身的值
            cfsTraversal(user.getChildRen(), map, index + 1);
        }
    }

    public static User buildUser() {
        User user = new User();
        user.setId(1);
        user.setName("座山雕");


        User user1 = new User();
        user1.setId(2);
        user1.setName("刘大脑袋");

        User user2 = new User();
        user2.setId(3);
        user2.setName("殷八字");

        User user3 = new User();
        user3.setId(4);
        user3.setName("刘大脑袋徒弟1");

        User user4 = new User();
        user4.setId(5);
        user4.setName("刘大脑袋徒弟2");

        User user5 = new User();
        user5.setId(6);
        user5.setName("殷八字徒弟2");

        List<User> list2 = new ArrayList<>();
        list2.add(user4);
        list2.add(user3);
        user1.setChildRen(list2);

        List<User> list3 = new ArrayList<>();
        list3.add(user5);


        user2.setChildRen(list3);

        List<User> list1 = new ArrayList<>();
        list1.add(user1);
        list1.add(user2);
        user.setChildRen(list1);
        return user;
    }

    static class User {
        private int id;
        private String name;
        private List<User> childRen;

        public int getId() {
            return id;
        }

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

        public String getName() {
            return name;
        }

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

        public List<User> getChildRen() {
            return childRen;
        }

        public void setChildRen(List<User> childRen) {
            this.childRen = childRen;
        }
    }
}

结果:
输入(一个对象):

{"childRen":[{"childRen":[{"id":5,"name":"刘大脑袋徒弟2"},{"id":4,"name":"刘大脑袋徒弟1"}],"id":2,"name":"刘大脑袋"},{"childRen":[{"id":6,"name":"殷八字徒弟2"}],"id":3,"name":"殷八字"}],"id":1,"name":"座山雕"}

输出(一个map)

{1=[座山雕], 2=[刘大脑袋, 殷八字], 3=[刘大脑袋徒弟2, 刘大脑袋徒弟1, 殷八字徒弟2]}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神雕大侠mu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值