给出 n 个节点,标号分别从 0 到 n - 1 并且给出一个 无向 边的列表 (给出每条边的两个顶点), 写一个函数去判断这张`无向`图是否是一棵树
样例
样例 1:
输入: n = 5 edges = [[0, 1], [0, 2], [0, 3], [1, 4]]
输出: true.
样例 2:
输入: n = 5 edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]]
输出: false.
注意事项
你可以假设我们不会给出重复的边在边的列表当中. 无向边 [0, 1] 和 [1, 0] 是同一条边, 因此他们不会同时出现在我们给你的边的列表当中。
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
if(edges.size()!=n-1) return false;
else if(n==1) return true;
vector<bool> visit(n,false);
vector<vector<int>> tmp(n);
for (int i = 0; i < n-1; i++) {
/* code */
int start=edges[i][0],end=edges[i][1];
tmp[start].push_back(end);
tmp[end].push_back(start);
}
search(tmp,visit,0);
for (int i = 0; i < n; i++) {
/* code */
if(!visit[i]) return false;
}
return true;
}
void search(vector<vector<int>>tmp,vector<bool>&visit,int cur)
{
visit[cur]=true;
queue<int> q;
for (int i = 0; i < tmp[cur].size(); i++) {
/* code */
int next=tmp[cur][i];
if(visit[next]==false)
search(tmp,visit,next);
}
}
};