Используя уникальный отсортированный список целых чисел, создайте сбалансированное дерево двоичного поиска, представленное в виде массива, без использования рекурсии.
Например:
func( [1,2,3,5,8,13,21] ) => [5,2,13,1,3,8,21]
Прежде чем мы начнем, подсказка: мы можем упростить эту проблему до тонны, так что нам на самом деле не нужно думать о входных целых числах (или любом подобном объекте в этом отношении!)
Если мы знаем, что входной список уже отсортирован, его содержимое не имеет значения. Мы можем просто думать об этом с точки зрения индексов в исходном массиве.
Внутреннее представление входного массива становится:
func( [0,1,2,3,4,5,6] ) => [3,1,5,0,2,4,6]
Это означает, что вместо того, чтобы писать что-то, имеющее дело с сопоставимыми объектами, нам действительно нужно написать только функцию, которая отображается из диапазона [0, n) в результирующий массив. Получив новый порядок, мы можем просто применить отображение обратно к значениям во входных данных, чтобы создать возвращаемый массив.
Действительные решения должны:
- Примите массив с нулевым элементом и верните пустой массив.
- Примите целочисленный массив длины n и верните целочисленный массив
- Длина между n и следующей наибольшей степенью 2 минус 1. (например, для входного размера 13 верните где-нибудь между 13 и 15).
- Массив, представляющий BST, где корневой узел находится в позиции 0, а высота равна log (n), где 0 представляет отсутствующий узел (или
null
-подобное значение, если позволяет ваш язык). Пустые узлы, если они есть, должны существовать только в конце дерева (например,[2,1,0]
)
Входной целочисленный массив имеет следующие гарантии:
- Значения - это 32-разрядные целые числа со знаком, больше нуля.
- Ценности уникальны.
- Значения в порядке возрастания от нулевой позиции.
- Значения могут быть разреженными (то есть не смежными друг с другом).
Побеждает самый лаконичный код по количеству символов ascii, но мне также интересно увидеть элегантные решения для любого конкретного языка.
Контрольные примеры
Выходы для простых массивов , содержащих , 1
чтобы n
для различных n
. Как описано выше, завершающие 0
s являются необязательными.
[]
[1]
[2,1,0]
[2,1,3]
[3,2,4,1,0,0,0]
[4,2,5,1,3,0,0]
[4,2,6,1,3,5,0]
[4,2,6,1,3,5,7]
[5,3,7,2,4,6,8,1,0,0,0,0,0,0,0]
[6,4,8,2,5,7,9,1,3,0,0,0,0,0,0]
[7,4,9,2,6,8,10,1,3,5,0,0,0,0,0]
[8,4,10,2,6,9,11,1,3,5,7,0,0,0,0]
[8,4,11,2,6,10,12,1,3,5,7,9,0,0,0]
[8,4,12,2,6,10,13,1,3,5,7,9,11,0,0]
[8,4,12,2,6,10,14,1,3,5,7,9,11,13,0]
[8,4,12,2,6,10,14,1,3,5,7,9,11,13,15]