iterativ Postorder travers bst?

stemmer
-1

Jeg har to spørsmål, 1) for noen rekursiv algoritme, eksisterer det en iterativ algoritme, er det riktig? Jeg tror det er riktig, fordi du bare nødt til å bruke stabelen explicit.And det er bekreftet i dette spørsmålet Veien å gå fra rekursjon til iterasjon

2) trolig det samme spørsmålet som ovenfor en, jeg tror virkelig ikke det iterative løsningen er åpenbar eller lett å skrive selv med rekursiv algoritme. For eksempel: for en Postorder (LRN) eller inorder (LNR) BST traversen, hvordan kunne du skrive det med iterativ metode? I disse to tilfellene, er det ikke lett å finne det første objektet til å sette inn i bunken. Det er der jeg fikk fast.

Noen forslag? Egentlig er min hensikt det samme som ovennevnte spørsmål, kan du prøve å finne et generelt mønster for å endre rekursiv algoritme for å iterative seg.

Publisert på 24/05/2011 klokken 07:45
kilden bruker
På andre språk...                            


1 svar

stemmer
0

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.

Svarte 24/05/2011 kl. 14:31
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more