したがって、4つのレベルを持つそのようなツリーがあります。
0 - 0th level
/ \
1 8 - 1th level
/ \ / \
2 5 9 12 - 2th level
/ \ /\ / \ / \
3 4 6 7 10 11 13 14 - 3th level
ご覧のとおり、DFSでは左の子が常に最初にアクセスするため、左の各子のルートのインデックスは1つ増えます(左=ルート+ 1)。2番目のノードには、左側のサブツリーのサイズ(right = left + leftSize)によって増加した左側のノードのインデックスがあります。木の深さがわかれば、そのサイズを計算できます(サイズ= 2 ^深さ-1)。左側のサブツリーの深さが親の深さに等しい深さが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);
}