Если у вас есть размеры каждого из поддеревьев, это может быть выполнимо без необходимости считывать данные в массив (или в противном случае обхода дерева) и подсчитывая. Если вы не будете держать информации о размере удобно, вам нужна вспомогательная функция для вычисления размера.
Основная идея, выяснить, что индекс текущего узла. Если оно меньше, чем к, вам нужно искать левое поддерево. Если он больше, чем к, поиск права компенсирующего узлов подсчитываются слева и ток. Обратите внимание, что это по сути то же самое, что и поиск через обычный BST, кроме этого времени мы ищем по индексу, а не данных. Некоторые псевдокод:
if size of left subtree is equal to k:
// the current node is kth
return data of current node
else if size of left subtree is greater than k:
// the kth node is on the left
repeat on the left subtree
else if size of left subtree is less than k:
// the kth node is on the right
reduce k by the size of the left subtree + 1 // need to find the (k')th node on the right subtree
repeat on the right subtree
Для иллюстрации рассмотрим это дерево с отмеченными показателями (даже не беспокоиться о данных, как это не важно в поиске):
3
/ \
2 6
/ / \
0 4 7
\ \
1 5
Предположим , что мы хотим найти 2 - е (к = 2).
Начиная с 3, размер левого поддерева равен 3.
Это больше , чем к настолько перейти на левое поддерево.
Размер левого поддерева равен 2.
К также 2 , так что текущий узел должен быть вторым.
Предположим , что мы хотим найти 4 - е (к = 4).
Начиная с 3, размер левого поддерева равен 3.
Это меньше , чем л так отрегулировать новый K равным 0 (к»= 4 - (3 + 1)) и перейти на правое поддерево.
Начиная с 6, размер левого поддерева равен 2.
Это больше , чем к»(0) , поэтому перейти на левое поддерево.
Размер левого поддерева равен 0.
к»также 0 , так что текущий узел должен быть четвёртым.
Вы получаете идею.