并查集基本操作:
union + find

解法1: 并查集
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
//union find
vector<int> parent(n, -1);
for(int i=0; i<edges.size(); i++){
//union
int p1 = find(edges[i][0], parent);
int p2 = find(edges[i][1], parent);
if(p1 == p2)
return false; //存在环
parent[p2] = p1;
}
return edges.size() == n-1; //树中若有n个点,则一定有n-1条边
}
//find
int find(int e, vector<int> p){
if(p[e] == -1)
return e;
else
return p[e] = find(p[e], p);
}
};
解法二: BFS