Există o modalitate mai bună de a găsi cel mai mic strămoș comun?

voturi
3

Știu întrebări similare au fost întrebat înainte, dar cred că soluția mea este mult mai simplă. Mai ales în comparație cu Wikipedia .

Vă rugăm să-mi dovedesc greșit!

Dacă aveți un arbore cu noduri care au dat structura de date:

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

Ai putea scrie o funcție de genul:

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

Acest cod este destul de simplu și cel mai rău caz, este O (n), caz medie este, probabil, O (logn), mai ales în cazul în care arborele este echilibrat (unde n este numărul de noduri din copac).

Întrebat 30/10/2010 la 03:26
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
5

Algoritmul arată bine pentru mine, cel puțin nu am putut gândi la ceva mai bun. Rețineți că nu aveți nevoie de indicatorul părinte; în schimb, puteți merge în jos copacul începând de la rădăcină, și pentru a găsi primul nod al cărui cheie stabilește între cele două taste inițiale.

Cu toate acestea, problema ta nu are nimic de-a face cu un singur Tarjan rezolvat. În primul rând, să ia în considerare arbori binare și el consideră copaci n-ary; dar acest lucru este, probabil, un detaliu. Mai important, să ia în considerare arbori de căutare, în timp ce Tarjan consideră copaci generale (fără a comanda pe taste). Problema ta este mult mai simplu, deoarece, în funcție de cheie, puteți ghici în cazul în care un anumit nod trebuie să fie în copac.

Publicat 01/11/2010 la 20:18
sursa de către utilizator

voturi
1

Nu imi pare rau. Dar algoritmul tau nu este bun. să ia următoarele BST:

10
  \
   \
   15
  / \
 14 16

Algoritmul You'r va reveni la 10 ca cel mai mic strămoș comun.

Astfel, ai putea scrie algoritm care să ia, să zicem, nodul stânga și decât du-te la mamă și a alerga în ordine pe ea și că cecului dacă acest drept a fost în producția de-ordinea în

Publicat 15/05/2013 la 23:02
sursa de către utilizator

voturi
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


}
Publicat 04/06/2013 la 08:52
sursa de către utilizator

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