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