Если сами узлы являются точками запроса, тогда время поиска может быть меньше. Вы можете начать со стадии возврата, и первые проверенные узлы уже находятся рядом с точкой запроса. Тогда большие участки дерева могут быть скоро обрезаны.
Ближайший сосед - это симметричное отношение (если n1 - ближайший сосед n2, то же самое относится и к n2), поэтому вам нужно искать только половину узлов, пропуская все узлы, уже отмеченные как ближайшие соседи. Просто идея.
Вы также можете попробовать поиск KD-Tree BBF (Best-Bin First), который поможет вам быстрее искать ближайшие узлы (ячейки). Я реализовал это в C #, поэтому напишите мне, если вы заинтересованы в исходном коде.
Конечно, фактическое время выполнения зависит от размерности, структуры KD-дерева и распределения точек в вашем наборе данных.
Группировка точек также может быть уместной.