Вот что я сделал. В моей программе ранг элемента определяется как 1+ (нет элементов больше, чем этот элемент). Здесь вы можете заметить, что элемент не обязательно должен присутствовать в дереве.
Алгоритм нахождения ранга:
1.В древовидной структуре следите за количеством элементов в поддереве, включая корень. Таким образом, верхушка дерева содержит все элементы дерева.
2.Сравните элемент с узлом, если он меньше, чем узел, то элементов (1 + нет элементов в правом дочернем элементе) больше, чем ключевой элемент. Добавьте его к общему количеству и рекурсивно ищите элемент в левом потомке.
3.Если элемент больше корневого узла, то просто рекурсивно ищите элемент в правом дочернем элементе (не нужно ничего добавлять, поскольку мы пренебрегаем левым деревом, в котором все элементы меньше заданного ключа )
4.Заключить алгоритм, когда вы обнаружите, что элемент достигнут нуля.
Данная программа не возвращает элементов больше указанного ключа. 1+ возвращаемое значение - ранг.
фрагмент кода:
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);
}
Надеюсь, это поможет:)