I would not necessarily classify this as a DFS problem and if so, I think it is worth mentioning IDDFS as an alternative to recursion because for senior role interviews, recursion can be rejected as a solution (with Java).
Hereby I solved it with BFS and Adjacency List.
import java.util.*;
public class TreeDiameter{
public static int diameterOfBinaryTree(BinaryTreeNode root) {
Deque<Pair> q = new LinkedList<>();
List<Pair> list = new ArrayList<>();
q.offer(new Pair(null, root));
while (!q.isEmpty()) {
Pair curr = q.poll();
list.add(curr);
if (curr.node.left != null) q.offer(new Pair(curr, curr.node.left));
if (curr.node.right != null) q.offer(new Pair(curr, curr.node.right));
}
Map<Integer, ArrayList<Integer>> graph = new HashMap<>();
for (Pair el : list) {
ArrayList<Integer> neighbors = new ArrayList<>();
if (el.parent != null) {
neighbors.add(el.parent.node.data);
}
if (el.node.left != null) {
neighbors.add(el.node.left.data);
}
if (el.node.right != null) {
neighbors.add(el.node.right.data);
}
graph.put(el.node.data, neighbors);
}
var max = 0;
for (Map.Entry<Integer, ArrayList<Integer>> integerArrayListEntry : graph.entrySet()) {
Deque<Pair2> q1 = new LinkedList<>();
HashSet<Integer> visited = new HashSet<>();
q1.add(new Pair2(null, integerArrayListEntry.getKey()));
visited.add(integerArrayListEntry.getKey());
while (!q1.isEmpty()) {
int tmp = 0;
Pair2 current = q1.poll();
visited.add(current.value);
Pair2 tail = current;
while (tail.parent != null) {
tmp++;
tail = tail.parent;
}
max = Math.max(max, tmp);
for (Integer integer : graph.get(current.value)) {
if (!visited.contains(integer)) {
q1.offer(new Pair2(current, integer));
}
}
}
}
return max;
}
public static class Pair2 {
Pair2 parent;
int value;
Pair2(Pair2 parent, int value) {
this.parent = parent;
this.value = value;
}
}
public static class Pair {
Pair parent;
BinaryTreeNode node;
Pair(Pair parent, BinaryTreeNode node) {
this.parent = parent;
this.node = node;
}
}
}
Course: Grokking Coding Interview Patterns in Java - Learn Interactively
Lesson: Diameter of Binary Tree - Grokking Coding Interview Patterns in Java