需求如下:现在需要判断,左侧表格中的父子节点数据,形成树结构时,是否有循环情况,如果有循环情况,则校验该表格不正确。
总的思路为:DFS 深度优先搜素算法
首先将父子节点的数据解析存为数组或是链表,此处作为数组,当然链表list也是可以的(表格解析代码此处不做梳理)
//模拟解析后的父子节点数据
private static String arrA[] = {"AA", "AA", "BB","CC"};//父节点
private static String arrB[] = {"BB", "DD", "CC","AA"};//子节点
构建树的思路为,先以第一条数据(AA,BB)为起点,作为根节点,将子节点BB作为父节点往下查找,树的深度+1,如果还有子节点,则依次类推(递归),如果查不到,则return树的深度。
private static int check5(int step) {
//三条数据深度最多为4 深度大于长度 则判断树有循环
if (count > arrA.length) {
return count;
}
//判断在父数组中是否存在子节点 不存在 说明是最后一层 不存在死循环
boolean contains = Arrays.asList(arrA).contains(arrB[step]);
if (contains) {
count++;
//获取子节点某数据在父节点的位置
int position = checkPosition(arrB[step]);
check5(position);//递归
}
return count;
}
判断子节点某数据在父节点的位置,防止表格数据乱序。
//判断子节点某数据在父节点的位置
private static int checkPosition(String son) {
List<String> strings = Arrays.asList(arrA);
for (int i = 0; i < strings.size(); i++) {
if (son.equals(strings.get(i))) {
return i;
}
}
return -1;
}
因为表格数据有四条数据,不能保证第一条数据就是根节点,所以需要遍历每条数据。
public static void main(String[] args) {
int b = 0;
for (int i = 0; i < arrA.length; i++) {
b = check5(i);
//如果树的深度大于表格列的长度,判断为有循环
if (b > count) {
//。。。有循环
}
count = 1;//将树深度的计数器复原
System.out.println("该树深度为:" + b);
}
}