无向图的DFS
261. Graph Valid Tree
题意:给一组边和点,判断这个图是不是能组成为树
解读:树的特点是没有环,所以这道题就是找这个图里面存不存在环。
Solution:
如何表示这个图,这道题给了所有的边,而且是无向图,我们可以用邻接矩阵来表示HashMap<Integer, ArrayList<Integer>>
。
如何在图上找环:DFS,看一个点是否会被访问两次。
注意:因为树是自顶向下的访问,递归函数需要一个 pre变量来记录上一个节点,以免回到上一个节点。 最后我们需要遍历一下所有的节点去看看是否所有的节点都被访问过。
Code
public class Solution {
public boolean validTree(int n, int[][] edges) {
HashMap<Integer, ArrayList<Integer>> map = new HashMap<>();
// build graph
for(int i = 0; i < n; i++) {
ArrayList<Integer> list = new ArrayList<>();
map.put(i, list);
}
// adjacency matrix
for(int[] edge : edges) {
map.get(edge[0]).add(edge[1]);
map.get(edge[1]).add(edge[0]);
}
boolean[] visited = new boolean[n];
// 所有的边都有自己的编号,所以检查编号就可以了
// pre变量,以免回到上一个节点
if(!helper(0, -1, map, visited)) {
return false;
}
// if all edge connected
for(boolean b:visited) {
if(!b) {
return false;
}
}
return true;
}
public boolean helper(int cur, int pre, HashMap<Integer, ArrayList<Integer>> map, boolean[] visited) {
if(visited[cur]) {
return false;
}
visited[cur] = true;
// 检查所有相邻的点,除了上一个节点
for(int i : map.get(cur)) {
if(i != pre && !helper(i, cur, map, visited)) {
return false;
}
}
return true;
}
}