Я кодирование кучи различных реализаций двоичного дерева поиска в последнее время (AVL, расставленный, декартово дерево) и любопытно, если есть особенно «хорошо» способ написания итератора для обхода этих структур. Решение я использовал прямо сейчас, чтобы каждый узел в BST хранить указатели на следующие и предыдущие элементы в дереве, что уменьшает итерацию к стандартной связному списку итерации. Тем не менее, я не очень доволен этим ответом. Это увеличивает использование пространства каждого узла с помощью двух указателей (следующих и предыдущих), и в каком-то смысле это просто обман.
Я знаю способ построения двоичного дерева поиска итератора, который использует O (h) вспомогательное пространство хранения (где Н высота дерева) с использованием стеки для отслеживания пограничных узлов, чтобы исследовать позже, но я ве сопротивлялся кодирования это вверх из-за использования памяти. Я надеялся, что есть какой-то способ, чтобы построить итератор, который использует только постоянное место.
Мой вопрос заключается в следующем - есть способ проектировать итератор бинарного дерева поиска со следующими свойствами?
- Элементы посещаются в порядке возрастания (т.е. симметричного обхода)
next()иhasNext()запросы выполняются в O (1) время.- Использование памяти представляет собой О (1)
Для того, чтобы сделать его проще, это нормально, если вы предполагаете, что структура дерева не изменяя форму во время итерации (т.е. без вставок, делеций или оборота), но было бы очень здорово, если бы там было решение, которое действительно может справиться с этим.













