Hier is wat ik heb gedaan. In mijn programma de rangschikking van een element wordt gedefinieerd als 1 + (aantal elementen groter is dan dat element). U kunt hier op te merken dat het element niet in de boom hoeft te presenteren.
Algoritme om rang te vinden:
1.In de boomstructuur bijhouden van de Aantal elementen in een substructuur met root. Dus het hoofd van de boom wil bevat totale elementen in de boom.
2.Compare het element met een knooppunt indien hij kleiner is dan het knooppunt, dan zijn er (1 + No.of elementen rechterkind) elementen groter is dan de sleutel element.Add aan het totale en recursief doorzocht het element in de linker kind.
3. Als het element groter is dan de root node dan gewoon zoeken op het element recursief in de juiste kind. (Geen noodzaak om iets toe te voegen, omdat we de linker boom verwaarlozen, waarin alle elementen kleiner zijn dan de opgegeven toets)
4.Terminate de algo als je merkt dat het element zijn nul bereikt.
Het gegeven programma had geen van de elementen groter is dan de bepaalde sleutel. 1+ de geretourneerde waarde is de rangschikking.
code 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);
}
Ik hoop dat dit helpt :)