Come trovare il rango di un nodo in un albero AVL?

voti
4

Ho bisogno di implementare due query rango [ rank(k)e select(r)]. Ma prima di poter iniziare su questo, ho bisogno di capire come funzionano le due funzioni.

Per quanto ne so, rank(k)restituisce il rango di una data chiave k, e select(r)restituisce la chiave di un dato rango r.

Quindi le mie domande sono le seguenti:

1.) Come si calcola il rango di un nodo in un BST AVL (auto bilanciamento)?

2.) E 'possibile per più di una chiave per avere lo stesso valore? E se sì, che cosa woulud select(r)tornare?

Ho intenzione di includere un albero campione AVL cui è possibile fare riferimento a se aiuta a rispondere alla domanda.

entrare

Grazie!

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


4 risposte

voti
3

La tua domanda si riduce veramente basso per: "come è il termine 'rango' normalmente definito rispetto ad un albero AVL?" (E, eventualmente, come è 'selezionare' normalmente come pure).

Almeno per quanto ho visto il termine usato, "rango" si intende la posizione tra i nodi dell'albero - vale a dire, quanti nodi sono alla sua sinistra. Stai tipicamente dato un puntatore ad un nodo (o forse un valore chiave) e avete bisogno di contare il numero di nodi alla sua sinistra.

"Select" è praticamente il contrario - si è dato un particolare posizionamento, e la necessità di recuperare un puntatore al nodo specificato (o il tasto per quel nodo).

Due note: In primo luogo, dal momento che nessuno di questi modifica l'albero a tutti, non fa differenza reale quale forma di bilanciamento viene utilizzato (ad esempio, AVL vs. rosso / nero); se è per questo un albero senza bilanciamento a tutti è equivalente pure. In secondo luogo, se avete bisogno di fare questo di frequente, è possibile migliorare la velocità notevolmente con l'aggiunta di un campo in più per registrando il numero di nodi sono alla sua sinistra ogni nodo.

Risposto il 28/02/2011 a 04:07
fonte dall'utente

voti
1

Rango è il numero di nodi dell'albero sub sinistra più uno, ed è calcolato per ogni nodo. Credo rango non è un concetto specifico per alberi AVL - può essere calcolato per ogni albero binario.

Select è proprio di fronte a rango. Un rango è dato e si deve restituire un corrispondente nodo che rango.

Il seguente codice eseguirà il calcolo Classifica:

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));
        }
}
Risposto il 30/08/2013 a 10:13
fonte dall'utente

voti
0

Ecco il codice che ho scritto e ho lavorato bene per AVL albero per ottenere il rango di un valore particolare. differenza è solo che si utilizza un nodo come parametro e ho usato una chiave di un parametro. è possibile modificare questo come modo tuo. Codice d'esempio:

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

[NB] Se si desidera avviare il vostro rank da 0 allora inizializzare rango variabile = 0. è sicuramente dovrebbe aver implementato le countNodes metodo () per eseguire questo codice.

Risposto il 08/09/2015 a 20:14
fonte dall'utente

voti
-1

Ecco quello che ho fatto. Nel mio programma di rango di un elemento è definito come il 1+ (senza di elementi maggiori di quell'elemento). Si può notare che l'elemento non è tenuta alla presentazione nella struttura.

Algoritmo per trovare Classifica:

1.In la struttura ad albero tenere traccia dei non di elementi in un albero secondario tra cui la radice. Così il capo della volontà albero elementi totali nella struttura.

2.Compare l'elemento con un nodo, se è più piccolo del nodo, poi ci sono (1 + No.of elementi figlio destro) Elementi superiore la chiave element.Add al totale e ricorsivamente ricercare l'elemento nel figlio sinistro.

3. Se l'elemento è maggiore del nodo principale, allora basta cercare l'elemento in modo ricorsivo nel bambino a destra. (Non c'è bisogno di aggiungere nulla dal momento che stiamo trascurando l'albero a sinistra, in cui tutti gli elementi sono meno della data chiave)

4.Terminate l'algo quando si trova l'elemento vengono raggiunti null.

Il dato programma non restituisce alcun di elementi superiore alla data chiave. 1+ il valore restituito è la posizione.

frammento di codice:

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

Spero che questo ti aiuti :)

Risposto il 03/10/2015 a 16:52
fonte dall'utente

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