给定n个从0到n-1标记的节点和一系列无向边(每个边是一对节点),请检查这些边是否形成有效树。
分析
可以将这个问题转换为从图形中查找循环。可以通过使用DFS(递归)或BFS(队列)来解决。
Java解决方案1-DFS
public boolean validTree(int n, int[][] edges) {
HashMap<Integer, ArrayList> map = new HashMap<Integer, ArrayList>();
for(int i=0; i<n; i++){
ArrayList list = new ArrayList();
map.put(i, list);
}
for(int[] edge: edges){
map.get(edge[0]).add(edge[1]);
map.get(edge[1]).add(edge[0]);
}
boolean[] visited = new boolean[n];
if(!helper(0, -1, map, visited))
return false;
for(boolean b: visited){
if(!b)
return false;
}
return true;}
public boolean helper(int curr, int parent,
HashMap<Integer, ArrayList> map, boolean[] visited){
if(visited[curr])
return false;
visited[curr] = true;
for(int i: map.get(curr)){
if(i!=parent && !helper(i, curr, map, visited)){
return false;
}
}
return true;}
Java解决方案2-BFS
public boolean validTree(int n, int[][] edges) {
ArrayList<ArrayList> list = new ArrayList<>();
for(int i=0; i<n; i++){
list.add(new ArrayList<>());
}
//build the graph
for(int[] edge: edges){
int a = edge[0];
int b = edge[1];
list.get(a).add(b);
list.get(b).add(a);
}
//use queue to traverse the graph
HashSet<Integer> visited = new HashSet<>();
LinkedList<Integer> q = new LinkedList<>();
q.offer(0);
while(!q.isEmpty()){
int head = q.poll();
if(visited.contains(head)){
return false;
}
visited.add(head);
ArrayList<Integer> vList = list.get(head);
for(int v: vList){
if(!visited.contains(v)){
q.offer(v);
}
}
}
if(visited.size()<n){
return false;
}
return true;
}
最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。