针对第一种需求:
第一步:如果想获取整棵树,先把根结点-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
以白话来理解此方法: (为了避免栈溢出,我们新建一个集合存放进入过此方法的节点,如果集合中存在此节点则跳过此节点)
1、以根结点进入此方法,根据该节点去获取对应的子节点 。
2、以1获取到的子节点,再去获取对应的子子节点
3、…
4、直到没有节点为止。