所以,我们有这样的树,有 4 个级别:
0 - 0th level
/ \
1 8 - 1th level
/ \ / \
2 5 9 12 - 2th level
/ \ /\ / \ / \
3 4 6 7 10 11 13 14 - 3th level
如您所见,每个左子节点的根索引都增加了一个(left = root + 1),因为在 DFS 中,左子节点总是首先访问。第二个节点的左节点索引增加了左子树的大小(右=左+左大小)。如果我们知道树的深度,我们可以计算它的大小(大小 = 2^depth - 1)。只要左子树的深度等于父级的深度减一,其大小 = 2^(parentDepth - 1) - 1。
所以现在我们有一个算法——计算左节点的索引,计算右节点的索引。如果节点索引位于它之间,则转到左侧节点,否则 - 转到右侧节点。
代码:
static int level(int index, int root, int treeDepth) {
if (index == root)
return 0;
if (treeDepth <= 0 /* no tree */ || treeDepth == 1 /* tree contains only root */)
throw new Exception("Unable to find node");
int left = root + 1;
int right = left + (int)Math.Pow(2, treeDepth - 1) - 1;
if (index == left || index == right)
return 1;
if (left < index && index < right)
return 1 + level(index, left, treeDepth - 1);
else
return 1 + level(index, right, treeDepth - 1);
}