Для красно-черного дерева вам не нужно отслеживать количество узлов слева, потому что, если оно смещено вправо (должно быть), то количество левых узлов всегда будет формировать ряд Мерсенна (1, 3, 7, 15 31 ...) или 2^depth -1
.
Имея это в виду, мы можем записать логику для рекурсивного получения узла. Принятый ответ выше помечен знаком . Это правильная реализация в эликсире. Для упаковки
def nth(%Rbtree{node: r}, n), do: do_nth(r, n)
defp do_nth({_,h,k,v,l,r}, n) do
l_count = left_count(h)
cond do
l_count > n ->
case l do
nil -> {k,v}
_ -> do_nth(l, n)
end
l_count == n -> {k,v}
true ->
case r do
nil -> {k,v}
_ -> do_nth(r, n - l_count - 1)
end
end
end
defp left_count(1), do: 0
defp left_count(0), do: 0
defp left_count(h), do: :math.pow(2,h-1)-1 |> round