Если вы знаете, сколько узлов ниже данного узла (постоянное время), вы можете просто сделать следующее:
int BinarySearchTree::countLessThan(const Node *n, const T &value) const {
if (n->value >= value) {
// The value has to be in the left sub-tree, so continue searching there:
if (n->left)
return countLessThan(n->left, value);
else
return 0;
} else {
// The value has to be in the right sub-tree, so continue searching there
// but include the whole left sub-tree and myself:
int count = 1;
if (n->left)
count += n->left->count();
if (n->right)
count += countLessThan(n->right, value);
return count;
}
}
Запустите алгоритм на корневом узле:
int BinarySearchTree::countLessThan(const T &value) const {
countLessThan(root, value);
}
живой пример можно увидеть здесь: http://ideone.com/JcpjeK
Он работает на следующем дереве (я поменял местами 14 и 10, поэтому 10 может быть левым ребенком 14 лет. Это связано с тем, что моя быстрая и грязная реализация BST допускает только правильный ребенок, если есть уже левый ребенок):
8
/ \
3 14
/\ /
1 6 10
не ищи. Подумайте и код. Вы знаете, как пройти дерево? Этого достаточно, чтобы начать. –