方法1: 我最近真的变菜了,很简单的dfs都做不出来。这边我是看了lc官方解答1,但是它是用iteration来实现dfs的,而我想用recursion来实现。我的代码参考的是这篇帖子。复杂度之后分析吧。
class Solution {
public boolean validTree(int n, int[][] edges) {
if(edges.length != n - 1) return false;
if(edges.length == 0) return true;
List<List<Integer>> adList = new ArrayList<>();
for(int i = 0; i < n; i++){
adList.add(new ArrayList<>());
}
for(int[] edge : edges){
adList.get(edge[0]).add(edge[1]);
adList.get(edge[1]).add(edge[0]);
}
Set<Integer> seen = new HashSet<>();
if(hasCircle(0, -1, adList, seen)) return false;
if(seen.size() != n) return false;
return true;
}
public boolean hasCircle(int node, int parent, List<List<Integer>> adList, Set<Integer> seen){
seen.add(node);
List<Integer> neighbours = adList.get(node);
for(int neighbour : neighbours){
if((seen.contains(neighbour) && parent != neighbour) || (!seen.contains(neighbour) && hasCircle(neighbour, node, adList, seen)))
return true;
}
return false;
}
}
总结:
- 复盘的时候自己写一遍dfs iteration;bfs。