Van egy jobb módja annak, hogy a legkisebb közös őse?

szavazat
3

Tudom hasonló keresték korábban, de azt hiszem, a megoldás sokkal egyszerűbb. Különösen képest Wikipedia .

Kérjük, bizonyítsd, hogy tévedek!

Ha van egy fa csomópontokat, amelyek a megadott adatok szerkezete:

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

Írhatsz egy függvény, mint ez:

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

Ez a kód nagyon egyszerű, és legrosszabb esetben O (n), egy átlagos esetben ez valószínűleg O (logn), különösen, ha a fa egyensúlyban (ahol n a csomópontok száma a fa).

A kérdést 30/10/2010 03:26
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
5

Az algoritmus úgy néz ki, rendben van, hogy nekem legalábbis nem tudtam gondolni semmi jobb. Fontos tudni, hogy nem kell a szülő mutató; ehelyett mehet le a fáról a gyökértől kezdve, és megtalálja az első csomópont amelynek legfontosabb állapítja két eredeti kulcs.

Azonban a probléma semmi köze az egy Tarján megoldani. Először is, ha figyelembe vesszük a bináris fák és úgy véli, n-ed rendű fák; de ez valószínűleg egy részlet. Ennél is fontosabb, ha figyelembe vesszük a keresés fák, míg Tarján tartja általános fák (nincs rendezés a kulcsok). A probléma sokkal egyszerűbb, mert attól függően, a kulcsot, akkor hiszem, ha egy bizonyos csomópontra kell lennie a fán.

Válaszolt 01/11/2010 20:18
a forrás felhasználó

szavazat
1

Nem, én sajnálom. De az algoritmus nem jó. végezze el a következő BST:

10
  \
   \
   15
  / \
 14 16

you'r algoritmus visszatér 10 legkisebb közös őse.

Így írhat algoritmust, amely veszi, mondjuk, a bal csomópont és mint menni a szülő és fut-rendet, és hogy ellenőrizze, hogy helyes volt a kimenete az in-order

Válaszolt 15/05/2013 23:02
a forrás felhasználó

szavazat
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


}
Válaszolt 04/06/2013 08:52
a forrás felhasználó

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