Nicht-rekursive post-order-traversal

Sah ich folgenden post-order-traversal Algorithmus in eine Homepage... es scheint richtig zu sein. Ich will einfach nur, um zu überprüfen, dass dieser Algorithmus arbeitet korrekt — ist dieser Algorithmus korrekt für post-order-Traversierung ohne Rekursion?

void postOrderTraversal(Tree *root)
{
    node * previous = null;
    node * s = null;
    push(root);
    while( stack is not empty )
    {
        s = pop();

        if(s->right == null and s->left == null)
        {
            previous = s;
            process s;
        }
        else
        {
            if(s->right == previous or s->left == previous)
            {
                previous = s;
                process s;
            }
            else
            {
                push( s );
                if(s->right) { push(s->right); }
                if(s->left)  { push(s->left);  }
            }
        }
    }
}
  • Haben Sie Lesen Sie den rest des Fadens in Algogeeks? mail-archive.com/[email protected]/msg03546.html
  • Es ist nicht syntaktisch rekursiv, weil es emuliert die Rekursion mit PUSH und POP.
  • Barry, ich würde behaupten, dass es unnötig ist, selbst zu qualifizieren, ist es mit "zu emulieren."
  • Nein, ich denke, dass es notwendig ist, weil sonst bekommen wir gesogen in die semantische tar-pit, wo wir nicht sagen, der Unterschied zwischen "iterativ" und "rekursiv", wie die Hälfte der Programmierer in der Welt bereits haben.
InformationsquelleAutor suresh | 2009-09-24
Schreibe einen Kommentar