iteratieve postorder traverse bst?

stemmen
-1

Ik heb twee vragen 1) voor recursieve algoritme bestaat een iteratief algoritme is dat? Ik denk dat het goed is, want je hoeft alleen de stapel gebruiken explicit.And wordt bevestigd in deze vraag weg te gaan van recursie naar iteratie

2) waarschijnlijk dezelfde vraag als het boven een, ik denk niet dat de iteratieve oplossing ligt voor de hand of gemakkelijk te schrijven, zelfs met de recursieve algoritme. Bijvoorbeeld: voor een postorder (LRN) of inorder (LNR) bst traverse, hoe kun je schrijven met iteratieve methode? In beide gevallen is het niet gemakkelijk om het eerste object in te voegen in de stapel te vinden. Dat is waar ik vast te zitten.

Eventuele suggesties? Eigenlijk is mijn doel is hetzelfde als de bovenstaande vraag, probeer dan een algemeen patroon recursieve algoritme veranderen om iteratieve degenen vinden.

De vraag is gesteld op 24/05/2011 om 08:45
bron van user
In andere talen...                            


1 antwoorden

stemmen
0

Ik heb het gevoel heb je de vraag niet goed gesteld. Ik zal proberen om de vraag hoe men kan denken over de uitvoering van de iteratieve versie van in-orde traversal te beantwoorden (ik toevallig dit enige gedachte te hebben gegeven en geïmplementeerd het zeer onlangs. Ik voel dat ik zal zelf ook helpen door te zetten deze naar beneden ) gezien het feit dat men de recursieve versie kent.

Elke functie oproep in een recursieve versie streeft naar het knooppunt in verband met de functie-oproep te bezoeken. De functie wordt zodanig gecodeerd dat activering frame overeenkomt met een knooppunt wordt opgeslagen in het systeem stapel (stack gebied dat proces) vóór het zijn belangrijkste werk kan doen, dat wil zeggen dan de knoop. Dit is zo omdat we willen de linker deelboom van het knooppunt te bezoeken voor een bezoek aan het knooppunt zelf.

Nadat de linker deelboom wordt bezocht, is een terugkeer naar het kader van onze opgeslagen knooppunt resultaten in de taalomgeving popping hetzelfde van de interne stack en een bezoek aan onze knooppunt nu toegestaan.

We hebben na te bootsen dit duwen en knallen met een expliciete stack.

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;
        }
    }
}

De beste manier om dit te begrijpen is om de werking van de interne stapel op papier te tekenen op elke oproep en de terugkeer van de recursieve versie.

antwoordde op 24/05/2011 om 15:31
bron van user

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