Есть ли способ залезть на дерево прямо на номер, не посещая другие ветки?Например, если у меня есть номер 11, я должен посетить его, перейдя к 2, затем к 5, а затем к 11 без какого-либо поиска.
0
/ \
/ \
/ \
1 2
/ \ / \
/ \ / \
3 4 5 6
/ \ / \ / \ / \
/ \ / \ / \ / \
7 8 9 10 11 12 13 14
Я убил много раз единственное, что получилтеперь, чтобы получить первый маршрут (1 или 2) числа N, нужно (n-1) / 2, пока n не станет равным 1 или 2. Пример: (12 - 1) / 2 => (5 - 1) / 2 => 2. (7-1) / 2 => (3-1) / 2 => 1. (11-1) / 5 => (2-1) / 2 => 1. Но конецбыло бы правильно обрезать корень (0) и рассматривать 2 как новый:
2
/ \
/ \
/ \
5 6
/ \ / \
/ \ / \
11 12 13 14
to
0
/ \
/ \
/ \
1 2
/ \ / \
/ \ / \
3 4 5 6
Решение:
int climb(int ID, Tree<int> t)
{
int time = 0;
if (tree.exists()) {
time += t.value();
tree t1, t2;
t.branches(t1, t2);
int branch = ID;
while (branch > 2) branch = (branch - 1)/2;
int offset = 1;
while (offset*2 < ID - 1) offset *= 2;
if (aux == 1) time += climb(ID - offset2/, a1);
if (aux == 2) time += climb(ID - offset, a2);
}
return time;
}
Вы можете получить доступ к ЛЮБОМУ (1, 5, 13,и т. д.) элемент полного двоичного дерева.