Если у вас есть размеры каждого из поддеревьев, это может быть выполнено без необходимости считывать данные в массив (или иным образом обходить дерево) и считать. Если вы не держите информацию о размере под рукой, вам понадобится вспомогательная функция для расчета размера.
Основная идея, выяснить, что является индексом текущего узла. Если это меньше, чем k, вам нужно искать левое поддерево Если оно больше, чем k, ищите справа смещение узлов, отсчитываемых от левого и текущего. Обратите внимание, что это по сути то же самое, что и поиск через обычный 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
Предположим, мы хотим найти второе (k = 2).
Начиная с 3, размер левого поддерева равен 3.
Он больше k, поэтому перейдите к левому поддереву.
Размер левого поддерева равен 2.
k также равно 2, поэтому текущий узел должен быть вторым.
Предположим, мы хотим найти четвертое (k = 4).
Начиная с 3, размер левого поддерева равен 3.
Это меньше чем l, поэтому установите новое k равным 0 (k '= 4 - (3 + 1)) и перейдите к правому поддереву.
Начиная с 6, размер левого поддерева равен 2.
Это больше, чем k '(0), поэтому перейдите к левому поддереву.
Размер левого поддерева - 0.
k 'также равно 0, поэтому текущий узел должен быть четвертым.
Вы поняли.