iterativ postordine traversare BST?

voturi
-1

Am două întrebări, 1) pentru orice algoritm recursiv, există un algoritm iterativ, este corect? Cred că e corect, pentru că trebuie doar să utilizați stiva explicit.And se confirmă în această întrebare mod de a merge de la recursivitate la iterație

2), probabil, aceeași întrebare ca cea de mai sus, eu chiar nu cred că soluția iterativ este evidentă sau ușor de a scrie chiar și cu algoritmul recursiv. De exemplu: pentru un postordine (NRL) sau inordine (LNR) BST traversa, cum ai putut scrie cu metoda iterativ? În aceste două cazuri, nu este ușor să găsiți primul obiect pentru a insera în stivă. Acolo m-am blocat.

Orice sugestii? De fapt, scopul meu este la fel ca și întrebarea de mai sus, încearcă să găsească un model general pentru a schimba algoritmul recursiv la cele iterative.

Întrebat 24/05/2011 la 08:45
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
0

Simt că nu ai pus întrebarea în mod corespunzător. Voi încerca să răspundă la întrebarea cu privire la modul în care se poate gândi despre punerea în aplicare a versiunii iterativ de parcurgeri în ordine (doar se întâmplă să am dat acest unele gândit și pus în aplicare foarte recent. Simt că mă va ajuta prea prin punerea acest lucru în jos ), având în vedere că se știe versiunea recursiv.

Fiecare apel de funcție într-o versiune recursiva urmărește să viziteze nodul asociat cu apelul funcției. Funcția este codat astfel încât activarea-cadru corespunzătoare unui nod este salvat pe sistemul de stivă (zona teanc de acest proces) înainte ca se poate face principalul său loc de muncă, și anume vizita nodul. Acest lucru se datorează faptului că dorim să viziteze subarborele stâng al nodului înainte de a vizita nodul în sine.

După subarborele din stânga este vizitat, o revenire la cadrul rezultatelor noastre de nod salvate în mediul de limbă popping același lucru din stiva internă și o vizită la nodul nostru este permisă acum.

Trebuie să mimeze această împingere și popping cu o stivă explicită.

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

Cel mai bun mod de a înțelege acest lucru este de a atrage funcționarea teancului interne pe suport de hârtie pe fiecare apel și returnarea versiunii recursiv.

Publicat 24/05/2011 la 15:31
sursa de către utilizator

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