en küçük ortak atası bulmak için daha iyi bir yolu var mı?

oy
3

Ben benzer sorular önceden sorulmuş biliyorum ama benim çözüm çok basit olduğunu düşünüyorum. Özellikle kıyasla Vikipedi .

Beni yanlış kanıtlamak Lütfen!

Verilen veri yapısına sahip düğümlerle bir ağaç varsa:

struct node
{
    node * left;
    node * right;
    node * parent;
    int key;
}

Böyle bir fonksiyon yazabiliriz:

node* LCA(node* m, node* n)
{
    // determine which of the nodes is the leftmost
    node* left = null;
    node* right = null;
    if (m->key < n->key)
    {
        left = m;
        right = n;
    }
    else
    {
        left = n;
        right = m;
    }
    // start at the leftmost of the two nodes,
    // keep moving up the tree until the parent is greater than the right key
    while (left->parent && left->parent->key < right->key)
    {
        left = left->parent;
    }
    return left;
}

Bu kod oldukça basittir ve en kötü durum O (n), ortalama vaka da (n ağacında düğüm sayısı olduğu) ağaç dengeli, özellikle eğer muhtemelen O (logn) olmasıdır.

Oluştur 30/10/2010 saat 03:26
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
5

Lütfen Algoritma en azından ben daha iyi bir şey düşünemedim, bana normal görünüyor. Üst işaretçi gerekmez unutmayın; bunun yerine kökünden başlayarak ağacının dibine gidip kimin anahtar iki başlangıç ​​anahtarlar arasında bırakır ilk düğümü bulabilirsiniz.

Ancak, senin sorunun tek Tarjan çözüldü ile hiçbir ilgisi yoktur. Her şeyden önce, ikili ağaçlar düşünün ve o n-li ağaçları düşünmektedir; ancak bu muhtemelen bir detaydır. Tarjan genel ağaçları (tuşların üzerinde hiçbir sipariş) dikkate almakla Daha da önemlisi, arama ağaçları düşünün. Belli bir düğüm ağacında olmak zorunda nerede anahtarına bağlı olarak, tahmin edebilirsiniz, çünkü sorun, çok daha kolaydır.

Cevap 01/11/2010 saat 20:18
kaynak kullanıcı

oy
1

Hayır üzgünüm. Ama algoritma iyi değil. Aşağıdaki BST almak:

10
  \
   \
   15
  / \
 14 16

you'r algoritması en küçük ortak atası olarak 10 dönecektir.

Böylece, demek, almak algoritması, sol düğümü yazmak ve daha üst sitesinden giderek doğru içinde sipariş çıktısında içi ise sipariş üzerine ve o çek çalıştırabilir

Cevap 15/05/2013 saat 23:02
kaynak kullanıcı

oy
1
Node* getAncestor( Node* root, Node* node1 , Node* node2 )
{
    if( root->val > node1->val && root->val > node2->val )
        getAncestor( root->left , node1 , node2 );
    //recursive call with left subtree

    if( root->val < node1->val && root->val < node2->val )
        getAncestor( root->right , node1 , node2 );
    //recursive call with right subtree

    return root ;
    //returning the root node as ancestor

    //initial call is made with the tree's root node
    //node1 and node2 are nodes whose ancestor is to be located


}
Cevap 04/06/2013 saat 08:52
kaynak kullanıcı

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