Если у каждого узла вашего дерева есть поле numLeft
, которое сообщает вам, сколько узлов есть в его левом поддереве (считая себя тоже), то вы можете сделать это в O(log N)
Просто добавляйте numLeft
к глобальной переменной результата для каждого узла, значение которого меньше x
:
countLessThan(int x, node T)
if T = null
return
if T.value >= x
countLessThan(x, T.left) // T.left contains only numbers < T.value and T.right only numbers > T.value
else
globalResult += T.numLeft
countLessThan(x, T.right)
Это будет считать только числа. Если вы хотите распечатать их, вам нужно написать первый обход глубины, который будет печатать поддерево, заданное в качестве параметра. Вы можете найти много таких в Интернете, поэтому я не буду это публиковать.