获取部门树( 上篇 ):直接取出一整棵部门树

获取部门树( 上 ) 直接取出一整棵树
获取部门树( 上篇 ):直接取出一整棵部门树_第1张图片

对于部门树,目前遇到有2种需求:

1、直接取出一整棵树
2、规定显示的层数,只显示2层或3层,通过逐级的节点访问子节点

针对第一种需求:
第一步:如果想获取整棵树,先把根结点-1取出。
第二步:再用-1去获取子级id 1和2
第三步:再用 1和2 去获取 3、4、5、6
第四步:再用3、4、5、6 去获取 。。。。
。。。

面对这种类型的问题,第一步到第N步都可以用一个方法解决的问题,

于是运用递归来解决问题:

在此,博主使用二维数组去测试, 实际中树的映射可能存在数据表中,替换成相应的sql即可

public class getTree {
    static int[][] trees = {
    {-1, 1}, {-1, 2}, {1, 3}, {1, 4}, {2, 5}, {2, 6}, {3, 7}, {3, 8}, {4, 9}, {4, 10}, {5, 11}, {5, 12}, {6, 13}};   //正常树结构
    //static int[][] trees = {
    {-1, 1}, {1, -1}, {1, 3}, {1, 4}, {2, 5}, {2, 6}, {3, 7}, {3, 8}, {4, 9}, {4, 10}, {5, 11}, {5, 12}, {6, 13}};   //出现无限循环的结构{-1, 1}, {1, -1},会出现栈溢出,开发过程中尽量避免数据库中会存入这些数据。

    public static void main(String[] args) {
        System.out.println(tree(-1));  //调用此方法
    }
    
    static List longList = new ArrayList<>();
    public static Map tree(Integer department_code) {
        Map tree = new HashMap();
        if(!longList.contains(department_code)){     //防止取出树时 ,出现无限循环的结构,出现栈溢出,此判断条件可根据需求放在需要的地方
            longList.add(department_code);  //外部longList集合 存节点,防止重复
            tree.put("node", department_code);  //存当前节点
            List sub = new ArrayList<>(); 
            if (department_code != null) {  
                for (int i = 0; i < trees.length; i++) {   
                    if (trees[i][0] == department_code) {  
                        sub.add(trees[i][1]);    // 根据传入的节点获取  节点对应的子节点
                    }
                }
                List sub1 = new ArrayList<>();
                if (sub != null) {  
                    for (Integer i : sub) {  //再根据取出来的集合 ,递归此方法
                        Map subtree1 = tree(i);
                        sub1.add(subtree1); 
                    }
                }
                tree.put("child", sub1);  //取出的集合 存入子节点
            }
        }
        return tree;
    }
}

以白话来理解此方法: (为了避免栈溢出,我们新建一个集合存放进入过此方法的节点,如果集合中存在此节点则跳过此节点)
1、以根结点进入此方法,根据该节点去获取对应的子节点 。
2、以1获取到的子节点,再去获取对应的子子节点
3、…
4、直到没有节点为止。

读到这里应该就可以理解到,递归就是条件一直在变,但是方法不变。直到不符合条件就跳出递归。

以上的程序得到的结果如下:
获取部门树( 上篇 ):直接取出一整棵部门树_第2张图片

你可能感兴趣的:(项目遇到的问题总结,java,递归法)