Давши унікальний, відсортований список цілих чисел, створіть збалансоване дерево бінарного пошуку, представлене у вигляді масиву без використання рекурсії.
Наприклад:
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
необов'язкове.
[]
[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]