Представлять узлы в виде массива и использовать арифметику указателей для доступа к левому и правому узлам данного узла.Например, числовая последовательность 4, 3, 7, 1, 6 сохраняется в двоичном дереве:
4
/ \
3 7
/ \
1 6
, если вы решите представить это дерево с помощью массива, положение левого потомкаузел в позиции C
равен 2 * C
, а его правый узел находится в 2 * C + 1
.В нашем примере число 3
находится в позиции second
.Его левый потомок находится в 2 * 2
, то есть в позиции fourth
, а правый потомок в 2 * 2 + 1
, то есть в пятой позиции:
values: 4 3 7 1 6
positions: 1st 2nd 3rd 4th 5th
В следующем примере кода показано, как ходитьдвоичное дерево на основе массива.Вы можете выяснить, как вставлять новые значения в дерево (используя приведенные выше формулы), как динамически увеличивать массив, как использовать арифметику указателей для доступа к дочерним узлам и т. Д .:
#include <stdio.h>
#define ARRAY_SIZE 5
static int btree[ARRAY_SIZE];
static void fill_btree ();
static void walk_btree ();
int
main ()
{
fill_btree ();
walk_btree ();
return 0;
}
static void
fill_btree ()
{
btree[0] = 4;
btree[1] = 3;
btree[2] = 7;
btree[3] = 1;
btree[4] = 6;
}
static int
pos (int i)
{
return ((i + 1) * 2);
}
static void
walk_btree ()
{
int i;
for (i = 0; i < ARRAY_SIZE; ++i)
{
int p = pos(i);
int root = btree[i];
int left = ((p - 1) < ARRAY_SIZE) ? btree[p-1] : 0;
int right = (p < ARRAY_SIZE) ? btree[p] : 0;
printf ("root: %d, left: %d, right: %d\n", root, left, right);
}
}