Jeg føler at du ikke har stilt spørsmålet riktig. Jeg vil prøve å svare på spørsmålet om hvordan man kan tenke på å implementere iterativ versjon av i-order traversering (jeg bare tilfeldigvis har gitt dette noen trodde og implementert det ganske nylig. Jeg føler at jeg vil hjelpe meg selv også ved å sette dette ned ) gitt at man kjenner den rekursive versjonen.
Hver funksjon samtale i en rekursiv versjon søker å besøke node knyttet til funksjonskall. Funksjonen er kodet slik at aktiveringen-ramme svarende til en node er lagret inn i systemet stabelen (stabel område av denne prosessen) før det kan gjøre sin hovedoppgave, dvs. gå noden. Dette er slik fordi vi ønsker å besøke venstre subtre av noden Før du besøker noden selv.
Etter den venstre undertreet er besøkt, er en retur til rammen av våre lagrede node resultater i språkmiljø dukker det samme fra den interne stabelen, og et besøk på vår node nå tillatt.
Vi må etterligne dette skyve og dukker med en eksplisitt stabelen.
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;
}
}
}
Den beste måten å forstå dette på er å trekke for det indre stabelen på papir på hver samtale og retur av den rekursive versjonen.