给出 n 个节点,标号分别从 0 到 n - 1 并且给出一个 无向 边的列表 (给出每条边的两个顶点), 写一个函数去判断这张`无向`图是否是一棵树
假设列表中没有重复的边。 无向边 [0, 1] 和 [1, 0] 是同一条边, 因此它们不会出现在列表中。
图是树的两个条件
1.有n个节点n-1条边
2.图为连通图
用set在遍历过程中保存所有节点 最后看set中元素数是否等于图的节点数
public class Solution {
public boolean validTree(int n, int[][] edges) {
if(n != edges.length + 1)
return false;
Queue<Integer> queue = new LinkedList<>();
Set<Integer> set = new HashSet<>();
Map<Integer,Set<Integer>> graph = initialize(n, edges);
queue.offer(0);
set.add(0);
while(!queue.isEmpty()){
int node = queue.poll();
for(Integer neighbour : graph.get(node)){
if(set.contains(neighbour))
continue;
queue.offer(neighbour);
set.add(neighbour);
}
}
return (set.size() == n);
}
public Map<Integer,Set<Integer>> initialize(int n, int[][] edges){
Map<Integer, Set<Integer>> graph = new HashMap<>();
for(int i = 0; i < n; i++){
graph.put(i, new HashSet<Integer>());
}
for(int i = 0; i < edges.length; i++){
int key = edges[i][0];
int value = edges[i][1];
graph.get(key).add(value);
graph.get(value).add(key);
}
return graph;
}
}