Проснувся, голодненький, начал думать, что мне нужен алгоритм обхода двумерного дерева но без рекурсий, так как выполнять я его буду в while цикле на GPU, а многие GPU языки программирования, особенно графические, рекурсию не умеют, поэтому остаётся только придумать безрекурсивный алгоритм.
И придумал. Где-то за час. Не знаю, есть уже такой или нет, но на всякий случай назову его своим именем: "Безрекурсивный алгоритм обхода N-мерных деревьев Константина Тарасенкова".
Для простоты примера возьмём двумерное дерево, хоть и алгоритм может работать с любой мерностью деревьев.
Каждая нода дерева возвращает правду (t) или ложь (f) -- нужно ли продолжать обход ветвей этой ноды или нет.
Наша цель, которую мы хотим найти, это правда (t) в конечной ветви дерева, которая в данном примере находится только в ноде под индексом 3.
В данном примере, дерево и его ноды выглядят так:
........... 0t ..........
.... 1t ....... 2t .....
.. 3t 4f ... 5f 6f ..
Для вычисления алгоритма дополнительно требуется только одно число (итератор, далее будет выглядеть как i) и один массив чисел (далее массив будет выглядеть как [индекс ноды, индекс ноды, ...])
Алгоритм состоит из 5-ти условий, можете пропустить читать их, они будут более понятны чуть позже:
1. Если итератор равен нулю, и текущая нода массива под итератором имеет индекс -1, -- терминация всего алгоритма.
2. Если текущая нода массива под итератором имеет индекс -1, -- декремент итератора на 1.
3. Если текущая нода массива под итератором имеет индекс не -1 и возвращает ложь (f), -- замена индекса этой ноды в массиве на -1, декремент итератора на 1.