1. 对于无根树或者无向图的节点的深度优先搜索中,因为无向的,所以我们必须将有联系的节点进行双向的联通,而邻接表对于这种问题的解决就再适合不过了,下面是构建邻接表的过程
2. 具体的步骤如下:
① 创建一个集合数组,将与当前有联系的节点加入到集合数组中,集合数组中的每一个元素都是一个集合,而集合是可以动态将元素装进去的,所以可以满足我们的需求,数组的下标表示的是当前节点的序号
② 怎么样进行双向的标记呢?在输入数据的时候将两个有联系的节点分别加入到集合数组对应的集合中
for(int i = 0; i < n - 1; i++){
int a = sc.nextInt();
int b = sc.nextInt();
list[a].add(b);
list[b].add(a);
}
3. 具体的代码如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
/*5
1 2
1 3
3 4
3 5*/
static List<Integer>[] list;
@SuppressWarnings("unchecked")
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
list = new ArrayList[n + 1];
for(int i = 1; i < n + 1; i++){
list[i] = new ArrayList<Integer>();
}
for(int i = 0; i < n - 1; i++){
int a = sc.nextInt();
int b = sc.nextInt();
list[a].add(b);
list[b].add(a);
}
for(int i = 1; i <= n; i++){
System.out.print(i + "---");
for(int j = 0; j < list[i].size(); j++){
System.out.print(list[i].get(j) + " ");
}
System.out.print("\n");
}
sc.close();
}
}