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
andedges = [[0, 1], [0, 2], [0, 3], [1, 4]]
, return true.
Given n = 5
andedges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]]
, return false.
Runtime: 213ms
1 class Solution { 2 public: 3 /** 4 * @param n an integer 5 * @param edges a list of undirected edges 6 * @return true if it's a valid tree, or false 7 */ 8 bool validTree(int n, vector<vector<int>>& edges) { 9 // Write your code here 10 11 // use union find to solve this problem. 12 // initialize the the union find array 13 if (!n) return true; 14 vector<int> uf; 15 for (int i = 0; i < n; i++) 16 uf.push_back(i); 17 18 // change the parent of all pairs accordingly 19 vector<bool> visited(n, false); 20 for (int i = 0; i < edges.size(); i++) { 21 if (visited[edges[i][0]] && visited[edges[i][1]] && uf[edges[i][0]] == uf[edges[i][1]]) return false; 22 updateFather(uf, edges[i][0], edges[i][1]); // The order of these lines are important!!! 23 visited[edges[i][0]] = true; 24 visited[edges[i][1]] = true; 25 } 26 27 // check whether have multiple fatheres 28 int father = uf[0]; 29 for (int i = 1; i < n; i++) { 30 if (uf[i] != father) return false; 31 } 32 return true; 33 } 34 35 void updateFather(vector<int>& uf, int from, int to) { 36 int temp = uf[to]; 37 for (int i = 0; i < uf.size(); i++) { 38 if (uf[i] == temp) uf[i] = uf[from]; 39 } 40 } 41 };