Υπάρχει καλύτερος τρόπος για να βρείτε ελάχιστο κοινό πρόγονο εκεί;

ψήφοι
3

Ξέρω ότι έχουν παρόμοιες ερωτήσεις ζητήθηκε πριν, αλλά νομίζω ότι η λύση μου είναι πολύ απλή. Ειδικά σε σχέση με την Wikipedia .

Παρακαλώ αποδείξει ότι κάνω λάθος!

Εάν έχετε ένα δέντρο με κόμβους που έχουν τη δεδομένη δομή δεδομένων:

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

Θα μπορούσατε να γράψετε μια λειτουργία όπως αυτό:

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

Αυτός ο κωδικός είναι αρκετά απλή και χειρότερη περίπτωση είναι O (n), η μέση περίπτωση είναι πιθανόν O (logn), ειδικά αν το δέντρο είναι ισορροπημένη (όπου n είναι ο αριθμός των κόμβων στο δέντρο).

Δημοσιεύθηκε 30/10/2010 στις 03:26
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
5

Αλγόριθμος σας φαίνεται εντάξει για μένα, τουλάχιστον εγώ δεν μπορούσα να σκεφτώ κάτι καλύτερο. Σημειώστε ότι δεν χρειάζεται η μητρική δείκτη? αντ 'αυτού μπορείτε να πάτε κάτω από το δέντρο ξεκινώντας από τη ρίζα, και να βρει το πρώτο κόμβο του οποίου το κλειδί καθορίζει μεταξύ των δύο αρχικών κλειδιά.

Ωστόσο, το πρόβλημα δεν έχει να κάνει με το ένα Tarján λυθεί. Πρώτα απ 'όλα, αν σκεφτεί κανείς δυαδικά δέντρα και θεωρεί n-αδική δέντρα? αλλά αυτό είναι πιθανώς μια λεπτομέρεια. Το πιο σημαντικό, αν σκεφτεί κανείς τα δέντρα αναζήτησης, ενώ Tarján θεωρεί γενικά δέντρα (χωρίς παραγγελία στα πλήκτρα). Το πρόβλημά σας είναι πολύ πιο απλή, γιατί, ανάλογα με το κλειδί, μπορείτε να μαντέψετε, όπου ένα συγκεκριμένο κόμβο πρέπει να είναι στο δέντρο.

Απαντήθηκε 01/11/2010 στις 20:18
πηγή χρήστη

ψήφοι
1

Οχι Λυπάμαι. Αλλά ο αλγόριθμος σας δεν είναι καλό. να λάβει την ακόλουθη BST:

10
  \
   \
   15
  / \
 14 16

αλγόριθμο you'r θα επιστρέψει το 10 ως το ελάχιστο κοινό πρόγονο.

Έτσι, θα μπορούσατε να γράψετε αλγόριθμο που λαμβάνει, δηλαδή, το αριστερό κόμβο και να πάει στη μητρική της και να τρέξει σε σειρά πάνω του και εκείνη ελέγχου, αν το δικαίωμα ήταν στην έξοδο της στην παραγγελία

Απαντήθηκε 15/05/2013 στις 23:02
πηγή χρήστη

ψήφοι
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


}
Απαντήθηκε 04/06/2013 στις 08:52
πηγή χρήστη

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