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.
Example 1:
Input: n = 5, and edges = [[0,1], [0,2], [0,3], [1,4]]
Output: true
Example 2:
Input: n = 5, and edges = [[0,1], [1,2], [2,3], [1,3], [1,4]]
Output: false
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 in edges.
class Solution {
public boolean validTree(int n, int[][] edges) {
if (edges.length != n - 1) return false;
// initialize all unions
int[] unions = new int[n];
Arrays.fill(unions, -1);
// check all edges for cycle and construct the unions
for (int[] edge : edges) {
int uGroup = find(unions, edge[0]);
int vGroup = find(unions, edge[1]);
if (uGroup == vGroup) return false;
else unions[vGroup] = uGroup;
}
return true;
}
// find the deepest parent which vetex belongs to (the union group)
private int find(int[] unions, int vertex) {
while(unions[vertex] != -1) {
vertex = unions[vertex];
}
return vertex;
}
}