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