|
1 | 1 | class Solution {
|
2 |
| - public int treeDiameter(int[][] edges) { |
3 |
| - Map<Integer, List<Integer>> graph = new HashMap<>(); |
4 |
| - for (int[] edge : edges) { |
5 |
| - graph.computeIfAbsent(edge[0], k -> new ArrayList<>()).add(edge[1]); |
6 |
| - graph.computeIfAbsent(edge[1], k -> new ArrayList<>()).add(edge[0]); |
| 2 | + public int treeDiameter(int[][] edges) { |
| 3 | + int n = edges.length; |
| 4 | + List<Set<Integer>> graph = new ArrayList<>(); |
| 5 | + boolean[] visited = new boolean[n + 1]; |
| 6 | + for (int i = 0; i < n + 1; i++) { |
| 7 | + graph.add(new HashSet<>()); |
| 8 | + } |
| 9 | + for (int[] edge : edges) { |
| 10 | + int nodeOne = edge[0]; |
| 11 | + int nodeTwo = edge[1]; |
| 12 | + graph.get(nodeOne).add(nodeTwo); |
| 13 | + graph.get(nodeTwo).add(nodeOne); |
| 14 | + } |
| 15 | + int[] diameter = {0}; |
| 16 | + dfs(0, visited, graph, diameter); |
| 17 | + return diameter[0]; |
7 | 18 | }
|
8 |
| - int farthestNode = bfsHelper(graph, 0)[0]; |
9 |
| - return bfsHelper(graph, farthestNode)[1]; |
10 |
| - } |
11 | 19 |
|
12 |
| - private int[] bfsHelper(Map<Integer, List<Integer>> graph, int node) { |
13 |
| - int farthestNode = 0; |
14 |
| - int steps = 0; |
15 |
| - Queue<Integer> queue = new LinkedList<>(); |
16 |
| - queue.add(node); |
17 |
| - Set<Integer> visited = new HashSet<>(); |
18 |
| - while (!queue.isEmpty()) { |
19 |
| - int size = queue.size(); |
20 |
| - while (size-- > 0) { |
21 |
| - int removedNode = queue.remove(); |
22 |
| - visited.add(removedNode); |
23 |
| - farthestNode = removedNode; |
24 |
| - for (Integer peer : graph.getOrDefault(removedNode, new ArrayList<>())) { |
25 |
| - if (!visited.contains(peer)) { |
26 |
| - queue.add(peer); |
27 |
| - } |
| 20 | + private int dfs(int node, boolean[] visited, List<Set<Integer>> graph, int[] diameter) { |
| 21 | + int highestDistance = 0; |
| 22 | + int secondHighestDistance = 0; |
| 23 | + visited[node] = true; |
| 24 | + for (Integer conn : graph.get(node)) { |
| 25 | + int distance = 0; |
| 26 | + if (!visited[conn]) { |
| 27 | + distance = 1 + dfs(conn, visited, graph, diameter); |
| 28 | + } |
| 29 | + if (distance > highestDistance) { |
| 30 | + secondHighestDistance = highestDistance; |
| 31 | + highestDistance = distance; |
| 32 | + } else if (distance > secondHighestDistance) { |
| 33 | + secondHighestDistance = distance; |
| 34 | + } |
28 | 35 | }
|
29 |
| - } |
30 |
| - if (!queue.isEmpty()) { |
31 |
| - steps++; |
32 |
| - } |
| 36 | + diameter[0] = Math.max(diameter[0], highestDistance + secondHighestDistance); |
| 37 | + return highestDistance; |
33 | 38 | }
|
34 |
| - return new int[]{farthestNode, steps}; |
35 |
| - } |
36 | 39 | }
|
0 commit comments