1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
private int count = 0;

public boolean validTree(int n, int[][] edges) {
if (edges.length != n - 1)
return false;
if (edges.length == 0)
return true;
Map<Integer, List<Integer>> nodeMap = new HashMap<>();
boolean[] visited = new boolean[n];
for (int[] edge : edges) {
nodeMap.putIfAbsent(edge[0], new ArrayList<>());
nodeMap.get(edge[0]).add(edge[1]);
nodeMap.putIfAbsent(edge[1], new ArrayList<>());
nodeMap.get(edge[1]).add(edge[0]);
}
return helper(nodeMap, visited, edges[0][0], edges[0][0]) && count == n;
}

private boolean helper(Map<Integer, List<Integer>> nodeMap, boolean[] visited, int currNode, int prevNode) {
if (visited[currNode])
return false;
visited[currNode] = true;
count += 1;
for (Integer node : nodeMap.get(currNode)) {
if (node != prevNode && !helper(nodeMap, visited, node, currNode))
return false;
}
return true;
}
}

比较直接, 就是DFS, 但注意的是不能走回头路. 于是有个变量prevNode要被传入.
时间复杂度: O(N)
空间复杂度: O(N)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public boolean validTree(int n, int[][] edges) {
if (edges.length != n - 1)
return false;
if (edges.length == 0)
return true;
Map<Integer, List<Integer>> nodeMap = new HashMap<>();
boolean[] visited = new boolean[n];
for (int[] edge : edges) {
nodeMap.putIfAbsent(edge[0], new ArrayList<>());
nodeMap.get(edge[0]).add(edge[1]);
nodeMap.putIfAbsent(edge[1], new ArrayList<>());
nodeMap.get(edge[1]).add(edge[0]);
}
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[] { edges[0][0], edges[0][0] });
while (!queue.isEmpty()) {
int[] currPrevNode = queue.poll();
visited[currPrevNode[0]] = true;
for (Integer node : nodeMap.get(currPrevNode[0])) {
if (node == currPrevNode[1])
continue;
if (!visited[node]) {
queue.offer(new int[] { node, currPrevNode[0] });
} else {
return false;
}
}
}
return true;
}
}

这是BFS的解法, 一样不走回头路.
时间复杂度: O(n)
空间复杂度: O(n)