public boolean validTree(int n, int[][] edges) {
if (n == 0) {
return false;
}
if (edges.length != n-1) return false;
Map<Integer, Set<Integer>> graph = initailGraph(n, edges);
Queue<Integer> q = new LinkedList<Integer>();
HashSet<Integer> set = new HashSet<>();
q.add(0);
set.add(0);
int visit = 0;
while (!q.isEmpty()) {
int tmp = q.poll();
visit++;
for (Integer neig : graph.get(tmp)) {
if (set.contains(neig)) {
continue;
}
q.add(neig);
set.add(neig);
}
}
return visit == n;
}
public Map<Integer, Set<Integer>> initailGraph(int n, int[][] edges) {
Map<Integer, Set<Integer>> graph = new HashMap<>();
for (int i = 0; i < n; i++) {
graph.put(i, new HashSet<Integer>());
}
for (int i = 0; i < edges.length; i++) {
int u = edges[i][0];
int v = edges[i][1];
graph.get(u).add(v);
graph.get(v).add(u);
}
return graph;
}