A tree, (NOT NECESSARILY BINARY), has nodes numbered 0 to N-1. An array has indices ranging from 0 to N-1. The indices denote the node ids and values denote the ids of parents. A value of -1 at some index k denotes that node with id k is the root. For ex:
3 3 3 -1 2 0 1 2 3 4
In the above, nodes with ids 0, 1 & 2 have 3 as parent. 3 is the root as its parent = -1 and 2 is the parent of node id 4.
Given such an array, find the height of the tree.
Solution:
A straightforward approach is to find the root, then find all its children, etc. (i.e. perform a BFS), and find out the maximum depth. This is a O(n^2) solution, although it requires only O(1) memory.
Using dynamic programming we can do this in O(n) time using O(n) memory:
public int countDepth(int[] tree) {
int[] height = new int[tree.length];
for (int i = 0; i < tree.length; i++)
height[i] = -1;
int maxHeight = -1;
for (int i = 0; i < tree.length; i++) {
if (height[i] == -1)
maxHeight = max(maxHeight, findHeight(i, height, tree));
}
return maxElement(height);
}
private int findHeight(int i, int[] height, int[] tree) {
if (height[i] != -1)
return height[i];
if (tree[i] == -1) {
height[i] = 0;
else
height[i] = 1 + findHeight(tree[i], height, tree);
return height[i];
}
Complexity:
time - O(n)Links and credits:
space - O(n)
http://www.careercup.com/question?id=22809662
No comments:
Post a Comment