I have a perfect binary tree, i.e. each node in the tree is either a leaf node, or has two children, and all leaf nodes are on the same level. Each node has an index in depth-first order.
(E.g. in a tree with 3 levels the root node has index 0, the first child has 1, the first child of the first child has 2, the second child of the first child has 3, the second child has 4, the first child of the second child has 5, the second child of the second child has index 6.
0
/ \
1 4
/ \ / \
2 3 5 6
)
I know the size of tree (number of nodes/maximum level), but only the index of a particular node, and I need to calculate its level (i.e. its distance to the rootnode). How do I do this most efficiently?
let i
be the index you are looking for and n
be the total number of nodes.
This algorithm do what you want:
level = 0
while i != 0 do
i--
n = (n-1)/2
i = i%n
level++
done
0 is the index of the root, if i = 0
then you are at the good level, else you can remove the root and you obtain two subtrees n = (n-1)/2
updates the number of nodes is the new tree (which is a subtree of the old one) and i = i%n
selects only the good subtree.