Я чувствую, вы не задали вопрос правильно. Я постараюсь ответить на вопрос о том, как можно думать о реализации итерационного версии упорядоченную обхода (Просто я дал эту некоторую мысль и реализовали его совсем недавно. Я чувствую, что я сдержаться тоже, поставив это вниз ) при условии, что один знает рекурсивную версию.
Каждый вызов функции в рекурсивной версии стремится посетить узел, связанный с вызовом функции. Функция кодируется таким образом, что активация кадр, соответствующий узлу сохраняется в стек системы (область стеки этого процесса) до того, как он может выполнять свою основную работу, т.е. посетить узел. Это так, потому что мы хотим, чтобы посетить левое поддерево узла перед посещением самого узла.
После того, как посещаются левое поддерево, возвращение к каркасу наших сохраненных результатов узла в языковой среде выскакивает же от внутреннего стека и посещения нашего узла теперь разрешено.
Мы должны имитировать это подталкивание и выскакивают с явным стеком.
template<class T>
void inorder(node<T> *root)
{
// The stack stores the parent nodes who have to be traversed after their
// left sub-tree has been traversed
stack<node<T>*> s;
// points to the currently processing node
node<T>* cur = root;
// Stack-not-empty implies that trees represented by nodes in the stack
// have their right sub-tree un-traversed
// cur-not-null implies that the tree represented by 'cur' has its root
// node and left sub-tree un-traversed
while (cur != NULL || !s.empty())
{
if (cur != NULL)
{
for (; cur->l != NULL; cur = cur->l) // traverse to the leftmost child because every other left child will have a left subtree
s.push(cur);
visit(cur); // visit him. At this point the left subtree and the parent is visited
cur = cur->r; // set course to visit the right sub-tree
}
else
{// the right sub-tree is empty. cur was set in the last iteration to the right subtree
node<T> *parent = s.top();
s.pop();
visit(parent);
cur = parent->r;
}
}
}
Лучший способ понять это сделать функционирование внутреннего стека на бумаге при каждом вызове и возврате рекурсивной версии.