Iată ce am făcut. În programul meu rangul unui element este definit ca 1+ (nr de elemente mai mare decât acel element). Puteți nota aici că elementul nu trebuie să prezinte în copac.
Algoritmul pentru a găsi rang:
1.In structura copac ține evidența nr de elemente într-un copac de sub inclusiv rădăcină. Deci, șeful voinței arbore conține elemente totale în copac.
2.Compare elementul cu un nod, în cazul în care acesta este mai mic decât nodul, atunci există (1 + No.of elemente copil dreapta) elemente mai mari decât cheia element.Add-l la total și de căutare recursiv elementului din copil stânga.
3.Dacă elementul este mai mare decât nodul rădăcină și apoi caută doar elementul recursiv în copilul din dreapta. (Nu este nevoie să adăugați ceva de când neglijăm copac din stânga, în care toate elementele sunt mai mici decât cheia dată)
4.Terminate algo când găsiți elementul sunt atinse nul.
Programul dat returnează nici elemente mai mari decât cheia dată. 1+ valoarea returnată este rangul.
fragment de cod:
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);
}
Sper că acest lucru vă ajută :)