Βρίσκοντας το k-μικρότερη τιμή σε μια BST

ψήφοι
0

Εδώ είναι αυτό που έχω να βρείτε το k-μικρότερη τιμή σε ένα δυαδικό δέντρο αναζήτησης:

struct treeNode 
{
   int data;
   struct treeNode *left, *right:
};

int rank(stuct treeNode* ptr, int k)
{
   if(node == NULL)
    return root; 

   while(ptr->left != NULL) {
     ptr = ptr->left;
     return rank(ptr->left)
   }
}

Αυτό προφανώς δεν είναι σωστή. Χωρίς να παρέχει τη λύση, θα μπορούσε κάποιος να με καθοδηγήσει προς τη σωστή κατεύθυνση για το πώς θα μπορούσε να λύσει αυτό; Έχω πρόβλημα υπολογίζοντας πώς θα μπορούσα να βρω το k-μικρότερο στοιχείο σε ένα BST.

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


3 απαντήσεις

ψήφοι
0

Αυτό θα πρέπει να εργαστεί:

int rank(struct treeNode* n,int k,int* chk)
    {
    if(!n) return -1;
    int _chk = 0;
    if(!chk) chk = &_chk;

    int t = rank(n->left,k,chk);
    if(t>=0) return t;

    if(++*chk > k) return n->data;

    int t = rank(n->right,k,chk);
    if(t>=0) return t;
    return -1;
    }

καλέστε ως rank(root,k,0)

Απαντήθηκε 03/05/2011 στις 02:35
πηγή χρήστη

ψήφοι
1

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

Η βασική ιδέα, να καταλάβω τι είναι ο δείκτης του τρέχοντος κόμβου. Αν είναι μικρότερη από k, θα πρέπει να αναζητήσετε το αριστερό υποδένδρο. Αν είναι μεγαλύτερη από k, αναζητήστε το δικαίωμα συμψηφισμού των κόμβων υπολογίζονται από την αριστερή και την τρέχουσα. Σημειώστε ότι αυτή είναι ουσιαστικά η ίδια με την αναζήτηση μέσω τακτικής BST, εκτός από αυτή τη στιγμή αναζητούμε με δείκτη, δεν είναι δεδομένα. Μερικά ψευδοκώδικα:

if size of left subtree is equal to k:
    // the current node is kth
    return data of current node
else if size of left subtree is greater than k:
    // the kth node is on the left
    repeat on the left subtree
else if size of left subtree is less than k:
    // the kth node is on the right
    reduce k by the size of the left subtree + 1 // need to find the (k')th node on the right subtree
    repeat on the right subtree

Για να φανεί, να εξετάσει αυτό το δέντρο με τις σημειώνονται δείκτες (δεν χρειάζεται καν να ανησυχείτε για τα δεδομένα που δεν είναι σημαντικό στην αναζήτηση):

        3
      /   \
     2     6
    /     / \
   0     4   7
    \     \
     1     5

Ας υποθέσουμε ότι θέλουμε να βρούμε το 2ο (k = 2).
Ξεκινώντας από 3, το μέγεθος του αριστερού υποδένδρου είναι 3.
Είναι μεγαλύτερη από k έτσι κινηθεί προς τα αριστερά υποδένδρο.
Το μέγεθος του αριστερού υποδένδρο είναι 2.
k είναι επίσης 2 έτσι ώστε η τρέχουσα κόμβος πρέπει να είναι η 2η.

Ας υποθέσουμε ότι θέλουμε να βρούμε το 4ο (k = 4).
Ξεκινώντας από 3, το μέγεθος του αριστερού υποδένδρου είναι 3.
Είναι λιγότερο από l, έτσι προσαρμόσει το νέο k να είναι 0 (k»= 4 - (3 + 1)) και να κινηθεί προς τα δεξιά υποδένδρο.
Ξεκινώντας από 6, το μέγεθος του αριστερού υποδένδρου είναι 2.
Είναι μεγαλύτερη από k»(0) έτσι κινηθεί προς τα αριστερά υποδένδρο.
Το μέγεθος του αριστερού υποδένδρο είναι 0.
k»είναι επίσης 0, έτσι το ρεύμα κόμβος πρέπει να είναι η 4η.

Μπορείτε να πάρετε την ιδέα.

Απαντήθηκε 03/05/2011 στις 02:45
πηγή χρήστη

ψήφοι
5

Ένα BST είναι μία ταξινομημένη δυαδικό δένδρο, ένας διάσχιση σε-σειρά (αριστερά subtree, τρέχοντα κόμβο, δεξιά υποδέντρο) θα δώσει ταξινομημένη τιμές κόμβο. Για να βρείτε το k-μικρότερο κόμβο, απλά κάνουμε μια διάσχιση σε σειρά με έναν μετρητή. Ο μετρητής ξεκινάει από 0, κάθε φορά που ένα κόμβος διασχίζεται, το αυξήσει κατά ένα, όταν φτάσει k, ο κόμβος είναι ο ΚΤΧ μικρότερο.

Απαντήθηκε 03/05/2011 στις 02:47
πηγή χρήστη

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