Given n
nodes labeled from 0
to n - 1
and a list ofundirected
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
思路是用并查集实现,如果一条边的两个点有相同的parent,意味着两个点属于一个集合, 所以必回形成环,所以就不是tree;
Given n = 5
and edges = [[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.
最后还要检查下有几个集合, 如果多余一个, 说明没连起来, 索爷也不是tree;
class Solution {
public:
/**
* @param n an integer
* @param edges a list of undirected edges
* @return true if it's a valid tree, or false
*/
bool validTree(int n, vector<vector<int>>& edges) {
// Write your code here
vector<int> linkedset;
if (n == 1 && edges.empty())
return true;
for (int i = 0; i < n; i++) {
linkedset.push_back(i);
}
for (int i = 0; i < edges.size(); i++) {
int root1= get_root(edges[i][0], linkedset);
int root2= get_root(edges[i][1], linkedset);
if (root1 == root2)
return false;
if (root1 > root2) {
linkedset[root1] = root2;
} else {
linkedset[root2] = root1;
}
}
int num_of_root = 0;
for (int i = 0; i < linkedset.size(); i++) {
if (linkedset[i] == i)
num_of_root++;
}
if (num_of_root != 1)
return false;
else
return true;
}
int get_root(int i, vector<int>& linkedset) {
while (linkedset[i] != i) {
i = linkedset[i];
}
return i;
}
};