178. 图是否是树
给出
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]
是同一条边, 因此他们不会同时出现在我们给你的边的列表当中。
public class Solution {
/**
* @param n: An integer
* @param edges: a list of undirected edges
* @return: true if it's a valid tree, or false
*/
public boolean validTree(int n, int[][] edges) {
if(n == 0){
return false;
}
//判断是否总共有n-1条边
if(edges.length != n - 1){
return false;
}
//初始化
Map<Integer,Set<Integer>> graph = init(n,edges);
//bfs 判断左右点是否都是连接的
Set<Integer> set = new HashSet<>();
Queue<Integer> queue = new LinkedList<>();
set.add(0);
queue.offer(0);
while(!queue.isEmpty()){
Integer node = queue.poll();
for(Integer val : graph.get(node)){
if(set.contains(val)){
continue;
}
set.add(val);
queue.offer(val);
}
}
return n == set.size();
}
private Map<Integer,Set<Integer>> init(int n, int[][] edges){
Map<Integer,Set<Integer>> graph = new HashMap<>();
for(int i = 0 ; i < n ; i++){
graph.put(i, new HashSet<>());
}
for(int i = 0; i < edges.length; i++){
int u = edges[i][0];
int v = edges[i][1];
graph.get(u).add(v);
graph.get(v).add(u);
}
return graph;
}
}