iterativo postorder traverse BST?

voti
-1

Ho due domande, 1) per qualsiasi algoritmo ricorsivo, esiste un algoritmo iterativo, è quello giusto? Penso che sia giusto, perché è sufficiente utilizzare lo stack explicit.And Si conferma in questa domanda modo per passare dalla ricorsione per iterazione

2) probabilmente la stessa domanda come sopra, io davvero non credo che la soluzione iterativa è ovvio o facile scrivere anche con l'algoritmo ricorsivo. Ad esempio: per un postorder (LRN) o inorder (LNR) BST traversata, come hai potuto scrivere con metodo iterativo? In questi due casi, non è facile trovare il primo oggetto da inserire nello stack. Ecco dove mi sono bloccato.

Eventuali suggerimenti? In realtà, il mio scopo è lo stesso della domanda di cui sopra, cercare di trovare un modello generale di cambiare algoritmo ricorsivo a quelli iterativi.

È pubblicato 24/05/2011 alle 08:45
fonte dall'utente
In altre lingue...                            


1 risposte

voti
0

Sento che non hai fatto la domanda in modo corretto. Cercherò di rispondere alla domanda su come si può pensare di attuare la versione iterativa di attraversamento in-order (Ho appena capita di aver dato questo qualche pensiero e realizzato molto di recente. Mi sento io a trattenermi troppo, mettendo questo in giù ) dato che si conosce la versione ricorsiva.

Ogni chiamata di funzione in una versione ricorsiva cerca di visitare il nodo associato con la chiamata di funzione. La funzione è codificata in modo tale che l'attivazione-frame corrispondente ad un nodo viene salvata nella pila sistema (area pila di tale processo) prima che possa fare il suo compito principale, cioè il nodo visitare. Questo è così perché vogliamo visitare il sottoalbero sinistro del nodo prima di visitare il nodo stesso.

Dopo la sottostruttura sinistra è visitato, un ritorno al telaio dei nostri risultati nodo salvati nell'ambiente lingua schioccare la stessa dalla pila interna e una visita al nostro nodo è ora consentito.

Dobbiamo imitare questo spingere e popping con uno stack esplicito.

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

Il modo migliore per capire questo è quello di disegnare il funzionamento della pila interna su carta per ogni chiamata e di ritorno della versione ricorsiva.

Risposto il 24/05/2011 a 15:31
fonte dall'utente

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