Trovare il valore di k-esimo più piccolo in un BST

voti
0

Ecco quello che devo trovare il valore k-esimo più piccolo in un albero binario di ricerca:

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

Questo ovviamente non è corretto. Senza fornire la soluzione, qualcuno potrebbe mi guida nella giusta direzione di come potrei risolvere questo problema? Sto avendo difficoltà a capire come sono riuscito a trovare l'elemento k-esimo più piccolo in un BST.

È pubblicato 03/05/2011 alle 02:17
fonte dall'utente
In altre lingue...                            


3 risposte

voti
0

Questo dovrebbe funzionare:

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

chiamare come rank(root,k,0)

Risposto il 03/05/2011 a 02:35
fonte dall'utente

voti
1

Se si hanno le dimensioni di ciascuno dei sottoalberi, questo può essere fattibile senza dover leggere i dati in una matrice (o altrimenti attraversare l'albero) e contando. Se non mantenere le informazioni formato pratico, avrete bisogno di una funzione di supporto per calcolare le dimensioni.

L'idea di base, capire qual è l'indice del nodo corrente. Se è minore di k, è necessario cercare la sottostruttura sinistra. Se è maggiore di k, cercare il diritto di compensazione i nodi contati da sinistra e corrente. Si noti che questo è essenzialmente lo stesso di ricerca attraverso un BST regolare, ma questa volta siamo alla ricerca per indice, non dati. Alcuni pseudocodice:

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

Per illustrare, considerare questo albero con gli indici segnati (non hanno nemmeno preoccuparsi dei dati non è importante nella ricerca):

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

Supponiamo di voler trovare il 2 ° (k = 2).
Partendo 3, la dimensione della sottostruttura sinistra è 3.
È maggiore di k così passare al sottoalbero sinistro.
La dimensione della sottostruttura sinistra è 2.
k è anche 2 in modo che il nodo corrente deve essere il secondo.

Supponiamo di voler trovare il 4 ° (k = 4).
Partendo 3, la dimensione della sottostruttura sinistra è 3.
È inferiore a L in modo regolare il nuovo k a 0 (k'= 4 - (3 + 1)) e spostarsi sottoalbero destro.
Partendo 6, la dimensione della sottostruttura sinistra è 2.
E è maggiore di k'(0) in modo da spostare il sottoalbero sinistro.
La dimensione della sottostruttura sinistra è 0.
k' è 0 quindi il nodo corrente deve essere il 4 °.

Si ottiene l'idea.

Risposto il 03/05/2011 a 02:45
fonte dall'utente

voti
5

Un BST è un albero binario ordinata, un attraversamento in ordine (sottostruttura sinistra, nodo corrente, sottoalbero destro) darà valori dei nodi ordinati. Per trovare il k-esimo più piccolo nodo, basta fare un attraversamento in ordine con un contatore. Il contatore inizia da 0, quando un nodo viene percorso, aumentarlo per uno, quando raggiunge k, il nodo è il k-esimo più piccolo.

Risposto il 03/05/2011 a 02:47
fonte dall'utente

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