Сначала простое наблюдение. Корень находится на 1 , поэтому все дети начинаются с 2 . До индекса i в куче есть i-1 вершин (помните, что индекс 0 не является вершиной!), У каждого из них 4 ребенка. Так, например, i th детей будет в 2 + 4 * (i-1) до 2 + 4 * i-1, 1 дети 2 + 4 * 0 = 2 до 2 + 4 * 0 + 3 = 5 .
def son_(i):
return range(2+4*(i-1),2+4*i)
for i in range(1,10): print i,son_(i)
выход
1 [2, 3, 4, 5]
2 [6, 7, 8, 9]
3 [10, 11, 12, 13]
4 [14, 15, 16, 17]
5 [18, 19, 20, 21]
6 [22, 23, 24, 25]
7 [26, 27, 28, 29]
8 [30, 31, 32, 33]
9 [34, 35, 36, 37]
дырок нет, см.
Если first_son (i) = 2 + 4i и last_son (i) = 2 + 4i + 3 = 4 (i + 1) +1, то у нас этот отец (n) = этаж ((n-2) / 4 ) +1. (+1 означает, что массив должен начинаться с 1)
Давайте проверим это:
def father_(n):
return (n-2)/4+1
for i in range(2,20): print i,father_(i)
Выход:
2 1
3 1
4 1
5 1
6 2
7 2
8 2
9 2
10 3
11 3
12 3
13 3
14 4
15 4
16 4
17 4
18 5
19 5