iteratif postorder çapraz BST?

oy
-1

Bunun doğru olduğunu, herhangi bir özyinelemeli algoritması için, bir iteratif bir algoritma vardır 1) iki soru var? Ben sadece yığın kullanmak zorunda explicit.And bu soru teyit edilir, çünkü, şu olduğunu düşünüyorum iterasyon için özyineleme gitmek için Way

yukarıdaki gibi 2) muhtemelen aynı soru, gerçekten iteratif çözüm apaçık hatta özyinelemeli algoritması ile yazmak kolay olduğunu sanmıyorum. Örneğin: Bir postorder (LRN) veya inorder (LNR) BST hareket için, nasıl yinelemeli yöntemle yazabilirim? Bu iki durumda da, bu yığının içine eklemek için ilk nesneyi bulmak kolay değil. Ben takılıp var orası.

Baska öneri? Aslında amacım yukarıdaki soruya aynıdır, yinelemeli olanlar için özyinelemeli algoritmayı değiştirmek için genel bir desen bulmaya çalışın.

Oluştur 24/05/2011 saat 08:45
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
0

Ben düzgün soru sormadınız hissediyorum. Bir de sipariş Çapraz geçiş tekrarlı versiyonunu uygulayan düşünmek nasıl sorusunu yanıtlamaya çalışacağım (Sadece bu biraz düşündüm ve çok yakın zamanda uygulayan olur. Ben bu aşağı koyarak çok kendim yardımcı olacaktır hissetmek ) bir özyinelemeli versiyonunu bilir ki.

Bir özyinelemeli sürümünde Her işlev çağrısı işlev çağrısı ile ilişkili düğüm ziyaret etmek istiyor. Bu örneğin, ana iş düğümün ziyaret önce fonksiyon bir düğüme ilgili aktivasyon çerçeve sistemi, yığın (bu işlemin yığın alanı) üzerine kaydedilir şekilde kodlanır. Biz düğüm kendisi ziyaret etmeden önce düğümün sol alt ağacı ziyaret etmek istiyorum, çünkü bu böyledir.

sol alt ağaç ziyaret edildikten sonra, iç yığın ve bizim düğüme ziyaretten aynı haşhaş dil ortamında bizim kaydedilmiş düğüm sonuçlarının çerçevesine dönüş artık izin verilir.

Bu itme ve açık bir deste ile haşhaş taklit gerekiyor.

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

Bunu anlamak için en iyi yolu, her çağrı ve özyinelemeli versiyonunun dönüşü kağıt üzerinde iç yığınının işleyişini çekmektir.

Cevap 24/05/2011 saat 15:31
kaynak kullanıcı

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