Given n
nodes labeled from 0
to n - 1
and a list of undirected
edges (each edge is a pair of nodes), write a function to check whether these edges make up a valid tree.
Notice
You can assume that no duplicate edges will appear in edges. Since all edges are undirected
, [0, 1]
is the same as [1, 0]
and thus will not appear together in edges.
Example
Given n = 5
and edges = [[0, 1], [0, 2], [0, 3], [1, 4]]
, return true.
Given n = 5
and edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]]
, return false.
需要注意的是,是不是有环存在,使用 edges - 1 == n来判定
public class Solution {
/*
* @param n: An integer
* @param edges: a list of undirected edges
* @return: true if it's a valid tree, or false
*/
public boolean validTree(int n, int[][] edges) {
// write your code here
if (n <= 0) {
return false;
}
if (edges.length != n - 1) {
return false;
}
Queue<Integer> queue = new LinkedList<>();
Set<Integer> set = new HashSet<>();
Map<Integer, Set<Integer>> graph = initializeGraph(n, edges);
queue.offer(0);
set.add(0);
while (!queue.isEmpty()) {
int node = queue.poll();
for (int val : graph.get(node)) {
if (!set.contains(val)) {
queue.offer(val);
set.add(val);
}
}
}
return set.size() == n;
}
private Map<Integer, Set<Integer>> initializeGraph(int n, int[][] edges) {
Map<Integer, Set<Integer>> map = new HashMap<>();
for (int i = 0; i < n; i++) {
map.put(i, new HashSet<Integer>());
}
for (int i = 0; i < edges.length; i++) {
int u = edges[i][0];
int v = edges[i][1];
map.get(u).add(v);
map.get(v).add(u);
}
return map;
}
}