Вы можете представить двоичное дерево в python как одномерный список точно таким же образом.
Например, если у вас есть дерево, представленное как:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
0
корень
1
& 2
следующий уровень
дочерние элементы 1
& 2
[3, 4]
и [5, 6]
Это соответствует вашей формуле.Для данного узла с индексом i
дочерние элементы этого узла (2*i)+1
(2*i)+2
.Это распространенный способ моделирования кучи.Вы можете прочитать больше о том, как Python использует это в своей [библиотеке heapq]. (https://docs.python.org/3.0/library/heapq.html)
Вы можете использовать это для обхода дерева на глубине с чем-то вроде:
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]
def childNodes(i):
return (2*i)+1, (2*i)+2
def traversed(a, i=0, d = 0):
if i >= len(a):
return
l, r = childNodes(i)
traversed(a, r, d = d+1)
print(" "*d + str(a[i]))
traversed(a, l, d = d+1)
traversed(a)
This Prints
15
6
14
2
13
5
11
0
10
4
9
1
8
3
7