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.
For example:
Given
n = 5
and
edges = [[0, 1], [0, 2], [0, 3], [1, 4]]
, return
true
.
Given
n = 5
and
edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]]
, return
false
.
Hint:
- Given
n = 5
andedges = [[0, 1], [1, 2], [3, 4]]
, what should your return? Is this case a valid tree? - According to the definition of tree on Wikipedia: “a tree is an undirected graph in which any two vertices are connected by exactly one path. In other words, any connected graph without simple cycles is a tree.”
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
.
/*algorithm: graph BFS*/
bool validTree(int n,vector<vector<int> >&edges){
vector<int>visited(n,0);
vector<vector<int> >adjlist(n,vector<int>());
queue<int>Q;
for(int i = 0;i < n;i++){
adjlist[graph[i][0]].push_back(graph[i][1]);
}
//search from 0 node
Q.push(0);
while(!Q.empty()){
int size = Q.size();
for(int i = 0;i < size;i++){
int id = Q.front();Q.pop();
if(visited[id]){
return false;
}
visited[id]=1;
//push its edge peer node
for(int k = 0;k < adjlist[id].size();k++){
Q.push(adjlist[id][k]);
}
}
}
//check visited array to see whether thre is node unvisited
for(int i = 0;i < visited.size();i++){
if(!visited[i])return false;
}
return true;
}