iterativní postorder traverza BST?

hlasů
-1

Mám dvě otázky, 1) pro každou rekurzivní algoritmus, existuje opakovací algoritmus, je to pravda? Myslím, že je to správné, protože stačí použít zásobník explicit.And je potvrzeno v této otázce cestu z rekurze k iteraci

2) pravděpodobně stejná otázka jako výše jednoho, já opravdu dont think iterativní řešení je zřejmé nebo snadné psát is rekurzivní algoritmus. Například: pro postorder (LRN) nebo nezbytného (LNR) BST traverzu, jak by si to psát iterační metoda? V těchto dvou případech, že to není snadné najít první objekt vložit do komína. To je to, kde jsem uvízl.

Nějaké návrhy? Ve skutečnosti, můj cíl je stejný jako výše uvedenou otázku, se snaží najít obecný model pro změnu rekurzivní algoritmus pro ty iterační.

Položena 24/05/2011 v 08:45
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
0

I pocit, že jste správně položil otázku. Pokusím se odpovědět na otázku, jak je možné uvažovat o realizaci iterativní verze na objednávku průchod (I jen náhodou dali tuto nějakou myšlenku a realizovány ji teprve nedávno. Cítím, že bude sám pomoci i tím, že toto dole ), za předpokladu, že člověk ví, rekurzivní verzi.

Každé volání funkce v rekurzivní verzi se snaží navštívit uzel spojený s volání funkce. Funkce je kódována tak, že aktivace rám, odpovídající uzlu, je uložena na systém zásobníku (stack prostoru tohoto procesu), před tím, než se může provést jeho hlavní práce, tj navštívit uzel. Je tomu tak proto, že chceme navštívit levý podstrom uzlu před návštěvou uzel sám.

Poté, co se na levý podstrom, návrat k rámu našich uložených výsledků uzel v jazykovém prostředí praskání stejný z vnitřního zásobníku a při návštěvě našeho uzlu je nyní povoleno.

Musíme napodobovat to tlačit a praskání s explicitním 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;
        }
    }
}

Nejlepší způsob, jak pochopit, je to k tomu fungování vnitřního zásobníku na papír na každé volání a vrácení rekurzivní verzi.

Odpovězeno 24/05/2011 v 15:31
zdroj uživatelem

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