Problem Description:
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.
For 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
.
Hint:
-
- Given
n = 5
andedges = [[0, 1], [1, 2], [3, 4]]
, what should your return? Is this case a valid tree? - According to the definition of tree on Wikipedia: “a tree is an undirected graph in which any two vertices are connected by exactly one path. In other words, any connected graph without simple cycles is a tree.”
- Given
Note: 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 inedges
.
class Solution {
public boolean validTree(int n, int[][] edges) {
if(edges.length != n-1 || edges.length == 0)
return false;
Map<Integer, Set<Integer>> neighbors = new HashMap<>(); // Neighbors of each node
for (int i = 0; i < edges.length; i++) {// Convert graph presentation from edge list to adjacency list
if (!neighbors.containsKey(edges[i][0])) neighbors.put(edges[i][0], new HashSet<Integer>());
if (!neighbors.containsKey(edges[i][1])) neighbors.put(edges[i][1], new HashSet<Integer>());
neighbors.get(edges[i][0]).add(edges[i][1]);
neighbors.get(edges[i][1]).add(edges[i][0]);
}
boolean[] visited = new boolean[n];
if (hasCycle(neighbors, edges[0][0], -1, visited))// Use DFS method to check if there's cycle in any curPath
return false;
for(int i = 0; i < n; i++){
if(!visited[i])
return false;
}
return true;
}
private boolean hasCycle(Map<Integer, Set<Integer>> neighbors, int kid, int parent, boolean[] visited) {
if(visited[kid])
return true;
visited[kid] = true;
for(Integer neighbor : neighbors.get(kid)){
if(neighbor != parent && hasCycle(neighbors, neighbor, kid, visited)){
return true;
}
}
return false;
}
}