Skip to content

Commit 1743d9d

Browse files
authored
Update Tree Diameter.java
1 parent 252eda7 commit 1743d9d

File tree

1 file changed

+33
-30
lines changed

1 file changed

+33
-30
lines changed

Medium/Tree Diameter.java

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,39 @@
11
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];
718
}
8-
int farthestNode = bfsHelper(graph, 0)[0];
9-
return bfsHelper(graph, farthestNode)[1];
10-
}
1119

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+
}
2835
}
29-
}
30-
if (!queue.isEmpty()) {
31-
steps++;
32-
}
36+
diameter[0] = Math.max(diameter[0], highestDistance + secondHighestDistance);
37+
return highestDistance;
3338
}
34-
return new int[]{farthestNode, steps};
35-
}
3639
}

0 commit comments

Comments
 (0)