Simt că nu ai pus întrebarea în mod corespunzător. Voi încerca să răspundă la întrebarea cu privire la modul în care se poate gândi despre punerea în aplicare a versiunii iterativ de parcurgeri în ordine (doar se întâmplă să am dat acest unele gândit și pus în aplicare foarte recent. Simt că mă va ajuta prea prin punerea acest lucru în jos ), având în vedere că se știe versiunea recursiv.
Fiecare apel de funcție într-o versiune recursiva urmărește să viziteze nodul asociat cu apelul funcției. Funcția este codat astfel încât activarea-cadru corespunzătoare unui nod este salvat pe sistemul de stivă (zona teanc de acest proces) înainte ca se poate face principalul său loc de muncă, și anume vizita nodul. Acest lucru se datorează faptului că dorim să viziteze subarborele stâng al nodului înainte de a vizita nodul în sine.
După subarborele din stânga este vizitat, o revenire la cadrul rezultatelor noastre de nod salvate în mediul de limbă popping același lucru din stiva internă și o vizită la nodul nostru este permisă acum.
Trebuie să mimeze această împingere și popping cu o stivă explicită.
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;
}
}
}
Cel mai bun mod de a înțelege acest lucru este de a atrage funcționarea teancului interne pe suport de hârtie pe fiecare apel și returnarea versiunii recursiv.