Πώς να βρείτε την τάξη ενός κόμβου σε ένα AVL δέντρο;

ψήφοι
4

Θα πρέπει να εφαρμόσουν δύο ερωτήματα βαθμό [ rank(k)και select(r)]. Αλλά πριν να ξεκινήσει σε αυτό, θα πρέπει να καταλάβω πώς λειτουργούν οι δύο λειτουργίες.

Απ 'όσο ξέρω, rank(k)επιστρέφει την τάξη ενός συγκεκριμένου κλειδιού k, και select(r)επιστρέφει το κλειδί ενός συγκεκριμένου βαθμού r.

Έτσι, οι ερωτήσεις μου είναι οι εξής:

1.) Πώς μπορείτε να υπολογίσετε την τάξη ενός κόμβου σε ένα AVL (αυτο εξισορρόπησης BST);

2.) Είναι δυνατόν περισσότερα από ένα κλειδί για να έχουν την ίδια τάξη; Και αν ναι, τι woulud select(r)επιστρέψει;

Πάω να περιλαμβάνουν ένα δέντρο AVL δείγμα το οποίο μπορείτε να ανατρέξετε σε περίπτωση που βοηθά να απαντήσει στην ερώτηση.

εισάγετε

Ευχαριστώ!

Δημοσιεύθηκε 28/02/2011 στις 03:40
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
3

Η ερώτησή σας βράζει πραγματικά κάτω: «πώς είναι ο όρος“τάξη”συνήθως ορίζεται σε σχέση με ένα AVL δέντρο;» (Και, ενδεχομένως, πως είναι «επιλογή» συνήθως ορίζεται ως επίσης).

Τουλάχιστον το έχω δει ο όρος που χρησιμοποιείται, «πιάτσα» νοείται η θέση μεταξύ των κόμβων στο δέντρο - δηλαδή, πόσοι κόμβοι είναι να τους αφήσει. Είσαι συνήθως δίνεται ένα δείκτη σε έναν κόμβο (ή ίσως μια βασική τιμή) και θα πρέπει να μετρήσει τον αριθμό των κόμβων στα αριστερά του.

«Επιλογή» είναι ουσιαστικά το αντίθετο - σας δίνεται ένα συγκεκριμένο βαθμό, και πρέπει να ανακτήσετε ένα δείκτη προς το καθορισμένο κόμβο (ή το πλήκτρο για αυτόν τον κόμβο).

Δύο σημειώσεις: Πρώτον, δεδομένου ότι καμία από αυτές τις τροποποιεί το δέντρο καθόλου, δεν κάνει καμία διαφορά ποια μορφή εξισορρόπησης χρησιμοποιείται (π.χ., AVL έναντι κόκκινο / μαύρο)? για το θέμα αυτό ένα δέντρο χωρίς εξισορρόπηση σε όλα ισοδυναμεί επίσης. Δεύτερον, αν χρειαστεί να το κάνετε αυτό συχνά, μπορείτε να βελτιώσετε την ταχύτητα σημαντικά με την προσθήκη ενός επιπλέον πεδίο για κάθε κόμβο εγγραφής πόσοι κόμβοι είναι στα αριστερά του.

Απαντήθηκε 28/02/2011 στις 04:07
πηγή χρήστη

ψήφοι
1

Η κατάταξη είναι ο αριθμός των κόμβων στο αριστερό υπο δέντρο συν ένα, και υπολογίζεται για κάθε κόμβο. Πιστεύω τάξη δεν είναι μια έννοια που ειδικά για AVL δέντρα - μπορεί να υπολογιστεί για κάθε δυαδικό δέντρο.

Επιλέξτε είναι ακριβώς απέναντι από την κατάταξη. Η πιάτσα είναι δεδομένη και θα πρέπει να επιστρέψει μια αντίστοιχη κόμβο που κατατάσσονται.

Ο ακόλουθος κώδικας θα εκτελέσει τον υπολογισμό κατάταξη:

void InitRank(struct TreeNode *Node)
{
        if(!Node)
        {
                return;
        }
        else
        {       Node->rank = 1 + NumeberofNodeInTree(Node->LChild);
                InitRank(Node->LChild);
                InitRank(Node->RChild);
        }

}


int NumeberofNodeInTree(struct TreeNode *Node)
{
        if(!Node)
        {
                return 0;
        }
        else
        {
                  return(1+NumeberofNodeInTree(Node->LChild)+NumeberofNodeInTree(Node->RChild));
        }
}
Απαντήθηκε 30/08/2013 στις 10:13
πηγή χρήστη

ψήφοι
0

Εδώ είναι ο κώδικας έγραψα και δούλεψε μια χαρά για AVL δέντρο για να πάρει το βαθμό του ιδιαίτερη αξία. διαφορά μόλις χρησιμοποιήσατε έναν κόμβο σαν παράμετρο και θα χρησιμοποιηθεί ένα πλήκτρο μία παράμετρος. μπορείτε να τροποποιήσετε αυτό το δικό σας τρόπο. Δείγμα κώδικα:

    public int rank(int data){
    return rank(data,root);
}

private int rank(int data, AVLNode r){
    int rank=1;
    while(r != null){
        if(data<r.data)
            r = r.left;
        else if(data > r.data){
            rank += 1+ countNodes(r.left);
            r = r.right;
        }
        else{
            r.rank=rank+countNodes(r.left);
            return r.rank;
        }
    }
    return 0;
}

[Σημείωση] Αν θέλετε να ξεκινήσετε το βαθμό σας από το 0 τότε η προετοιμασία μεταβλητή rank = 0. σίγουρα θα πρέπει να έχουν εφαρμόσει τις μέθοδο countNodes () για να εκτελέσετε αυτόν τον κώδικα.

Απαντήθηκε 08/09/2015 στις 20:14
πηγή χρήστη

ψήφοι
-1

Εδώ είναι αυτό που έχω κάνει. Στο πρόγραμμά μου η κατάταξη ενός στοιχείου ορίζεται ως η 1+ (όχι των στοιχείων είναι μεγαλύτερη από αυτό το στοιχείο). Μπορείτε να σημειωθεί εδώ ότι το στοιχείο δεν χρειάζεται να παρουσιάσει στο δέντρο.

Αλγόριθμο για να βρείτε κατάταξη:

1.In τη δομή δέντρου να παρακολουθείτε την όχι των στοιχείων σε επιμέρους δέντρο, συμπεριλαμβανομένης της ρίζας. Έτσι, ο επικεφαλής της βούλησης δέντρου περιέχει συνολικά στοιχεία στο δέντρο.

2.Compare το στοιχείο με έναν κόμβο, εάν είναι μικρότερο από τον κόμβο, τότε υπάρχουν (1 + No.of στοιχεία στο δεξί παιδί) στοιχεία μεγαλύτερο από το κλειδί αυτό element.Add με το συνολικό και αναδρομικά αναζήτηση του στοιχείου στην αριστερό παιδί.

3. Εάν το στοιχείο είναι μεγαλύτερο από τον κόμβο ρίζα τότε απλά αναζήτηση στο στοιχείο αναδρομικά το δικαίωμα του παιδιού. (Δεν χρειάζεται να προσθέσω τίποτα δεδομένου ότι παραμελούμε το αριστερό δέντρο, στο οποίο όλα τα στοιχεία είναι μικρότερο από το συγκεκριμένο κλειδί)

4.Terminate το algo όταν βρείτε το στοιχείο που έφθασε μηδενική.

Το συγκεκριμένο πρόγραμμα δεν επιστρέφει στοιχείων είναι μεγαλύτερη από το συγκεκριμένο κλειδί. 1+ η επιστρεφόμενη τιμή είναι η τάξη.

Κωδικός απόσπασμα:

int AVLUtils::rank(Node *root,long long val)
  {
    int n_ele_greater=0;
    int rank =0;

    if(root == NULL)
    return 0;
   if(val < root->key)
     {
    n_ele_greater = 1+this->n_elements(root->right_child)+this->rank(root->left_child,val);
     }
   else if(val > root->key)
     {
    n_ele_greater=this->rank(root->right_child,val);
    }

    else if(val == root->key)
    {
    return(this->n_elements(root->right_child));
    }
    return(n_ele_greater);
   }

Η ελπίδα αυτό βοηθά :)

Απαντήθηκε 03/10/2015 στις 16:52
πηγή χρήστη

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