


N = 4
Edges = [2 3], [4 3], [1 3]
Output: 2
Here node 4 is at a distance 2 from node 1 and if we make node 1 as a root, it will give the height of 2, which is the maximum possible in this tree.
The first line contains a single integer 'T' denoting the number of test cases to be run. Then the test cases follow.
The first line of each test contains integer 'N' denoting the number of nodes in the tree, and the following N-1 lines contain two nodes each.
For each test case, print an integer denoting the tree's maximum height when we consider any arbitrary node as a root.
You are not required to print anything; it has already been taken care of. Just implement the function.
1 <= T <= 50
1 <= N <= 10^4
Time Limit: 1 sec.
A straightforward approach would be to traverse the tree using DFS for every node and calculate the maximum height when the node is treated as the tree's root. The time complexity for the DFS traversal of a tree is O(N). The overall time complexity of DFS for all N nodes will be O(N^2).
Approach
We use dynamic programming to optimize the DFS approach.
For every node, we can precalculate two things.
Optimal Substructure:
When node i is considered as a root,
The maximum height of a tree when node i is
considered as a root will be max(in[i], out[i]).
When there are multiple branches of a parent, take the longest of all of them to count the answer.
Recurrence relation of in[i] and out[i]:
in[i] = max(1 + in[child], in[i])
out[i] = 1 + max(out[parent of i], 1 + longest path of all branches of parent of i)
Algorithm