Я реализую итератор InOrder для домашнего задания, что означает, что итератор продвигается следующим образом:
- Посещение левого ребенка
- Узел посещения
- Посещение справаChild
Существуют также следующие ограничения сложности: Обход по всему дереву должен иметь сложность во время выполнения o (n), где n - количество узлов в дереве и сложность памяти o (h).) где h - высота дерева.
Я пытался использовать этот метод для реализации оператора advance (++):
Tree<DataT>::_InOrderIterator::operator++()
{
TreeNode* node = this->Node->GetRightChild();
while(node != NULL)
{
advanceStack.Push(node);
node = node->GetLeftChild();
}
node = advanceStack.Pop();
if (node == NULL)
{
node = end; //reserved end node
}
this->Node = node;
return *this;
}
Я не проверял егоно я думаю, что это должно работать нормально.Мои проблемы начались, когда я пытался реализовать оператор Rede (-).Мой первоначальный подход состоял в том, чтобы иметь второй стек: recedeStack и использовать его так же, как я использовал его для оператора ++.Но я не мог понять, как синхронизировать стек возвратов в операторе ++ и наоборот (advanceStack в операторе -).Во всяком случае, не без превышения ограничения сложности памяти.
Есть идеи, как решить эту проблему (с моей текущей реализацией или без)?