Jak znaleźć rangę węzła w drzewie AVL?

głosy
4

Muszę wdrożyć dwa zapytania rangi [ rank(k)i select(r)]. Ale zanim zacznę się nad tym, trzeba dowiedzieć się, jak działają te dwie funkcje.

O ile mi wiadomo, rank(k)zwraca rangę danego klucza ki select(r)zwraca klucz danej rangi r.

Więc moje pytania to:

1) W jaki sposób obliczyć rangę węzła w BST AVL (równoważenia self)?

2.) Czy możliwe jest więcej niż jeden klucz do mają taką samą rangę? A jeśli tak, to co woulud select(r)powrócić?

Zamierzam to drzewo AVL próbki, które można odnieść do czy to pomaga odpowiedzieć na pytanie.

wprowadzić

Dzięki!

Utwórz 28/02/2011 o 03:40
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
3

Twoje pytanie tak naprawdę sprowadza się do: „jaki jest termin«ranga»normalnie określone w odniesieniu do drzewa AVL?” (I ewentualnie w jaki sposób można „wybrać” normalnie zdefiniowany jako dobrze).

Przynajmniej jak widziałem termin używany „ranga” oznacza pozycję wśród węzłów w drzewie - to znaczy, ile węzłów na jej lewej stronie. Jesteś zazwyczaj podany wskaźnik do węzła (lub być może wartość klucza) i trzeba policzyć liczbę węzłów na jego lewej stronie.

„Wybór” jest w zasadzie przeciwieństwem - dostaniemy szczególną rangę, i trzeba pobrać wskaźnik do określonego węzła (lub klucz do tego węzła).

Dwie uwagi: po pierwsze, ponieważ żadna z tych modyfikuje drzewa w ogóle, to nie ma realnej różnicy jaka forma równoważenia jest używany (np AVL vs. czerwony / czarny); dla tej sprawy drzewo bez balansowania na wszystko odpowiada również. Po drugie, jeśli trzeba to robić częściej, można zwiększyć prędkość znacznie dodając dodatkowe pole do każdego węzła nagrywania ilu węzły są do jej lewej stronie.

Odpowiedział 28/02/2011 o 04:07
źródło użytkownik

głosy
1

Pozycja jest liczba węzłów w drzewie sub Lewicy plus jeden, i jest obliczany dla każdego węzła. Wierzę, ranga nie jest pojęciem specyficzne AVL drzew - może być obliczany dla każdego drzewa binarnego.

Select jest naprzeciwko oceniającym. Postój jest podana i trzeba zwrócić dopasowanie węzła tej rangi.

Poniższy kod wykona obliczenia Rank:

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));
        }
}
Odpowiedział 30/08/2013 o 10:13
źródło użytkownik

głosy
0

Oto kod napisałem i działało dobrze dla Drzewo AVL uzyskać rangę określonej wartości. Różnica jest tylko użyłeś węzeł jako parametr i użyłem klucza parametr. można zmodyfikować to jako swój własny sposób. Przykładowy kod:

    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] Jeśli chcesz zacząć swoją rangę od 0 następnie zainicjować zmienną rangę = 0. na pewno powinny wdrożyły countNodes metoda (), aby wykonać ten kod.

Odpowiedział 08/09/2015 o 20:14
źródło użytkownik

głosy
-1

Oto co mam zrobić. W moim programie ranga element jest zdefiniowany jako 1+ (bez elementów większy niż element). Można tu zauważyć, że element nie musi przedstawiać w drzewie.

Algorytm znaleźć rangę:

1.In strukturze drzewa śledzić bez elementów w pod drzewem tym korzenia. Tak szef woli drzewo zawiera łączne elementy w drzewie.

2.Compare elementu z węzła, jeżeli jest ona mniejsza niż węzeł, to istnieją (1 + ilosc elementów w prawym dziecko) elementy większe niż klucz element.Add go do całkowitego i rekurencyjnie przeszukać elementem lewa dziecko.

3.Jeżeli element jest większy od węzła głównego następnie wystarczy wyszukać element rekurencyjnie we właściwym dziecka. (Nie trzeba dodawać nic od nas zaniedbuje drzewie po lewej stronie, w której wszystkie elementy są mniejsze niż dany klucz)

4.Terminate z algo gdy znajdziesz element osiąga wartość null.

Dany program wraca bez elementów większych niż danego klawisza. 1+ zwrócona wartość jest ranga.

Kod snippet:

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

Mam nadzieję że to pomoże :)

Odpowiedział 03/10/2015 o 16:52
źródło użytkownik

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