--- id: 587d825a367417b2b2512c8a title: Вставити елемент у максимальну купу challengeType: 1 forumTopicId: 301703 dashedName: insert-an-element-into-a-max-heap --- # --description-- А тепер перейдемо до іншої деревоподібної структури даних — двійкової купи. Двійкова купка — це частково впорядковане двійкове дерево, яке задовольняє властивість купи. Властивість купи визначає співвідношення між батьківським та дочірнім вузлами. Існує зростаюча купа, у якої всі батьківські вузли мають більше або рівне значення відносно дочірніх вузлів, та неспадна купа, де ця умова діє у зворотньому напрямку. Двійкові купи — це ще також повні двійкові дерева. Це означає, що всі рівні дерева повністю заповнені або, якщо останній рівень неповний, він заповнений зліва направо. І хоч двійкові купи реалізуються у вигляді дерева з вузлами, що ростуть уліво та вправо, відповідно до властивості купи вона може бути представлена масивом, за умови часткового впорядкування. Нас цікавить співвідношення батьківський-дочірній вузол, а з допомогою простої арифметики ми зможемо обрахувати кількість дочірних елементів певного батьківського вузла та батьків конкретного дочірнього вузла. Приміром, розглянемо наступну двійкову неспадну купу у вигляді масиву: ```js [ 6, 22, 30, 37, 63, 48, 42, 76 ] ``` Перший елемент — кореневий вузол — `6`. Його дочірні вузли — `22` та `30`. Якщо поглянути на відношення між індексами масиву цих значень, то для індексу `i` дочірніми вузлами будуть `2 * i + 1` and `2 * i + 2`. Схожим чином елемент в індексі `0` буде мати батьківське відношення стосовно цих двох дочірніх вузлів в індексі `1` і `2`. Загалом можна знайти батьківський вузол у будь-якому індексі, використовуючи такий шаблон: `Math.floor((i - 1) / 2)`. За ним можна отримувати правдиву інформацію незалежно від розміру дерева. На завершення, ми можемо зробити незначне коригування, щоб полегшити обчислення, пропустивши перший елемент у рядку. Ця дія створює зв'язки з кожним елементом із заданим індексом `i`: Приклад відображення масиву: ```js [ null, 6, 22, 30, 37, 63, 48, 42, 76 ] ``` Лівий дочірній вузол елемента: `i * 2` Правий дочірній вузол елемента: `i * 2 + 1` Батьківський вузол елемента: `Math.floor(i / 2)` Як тільки ці обрахунки вклалися у голові, використання двійкового масиву стане у пригоді, оскільки це уможливить швидке визначення розташування вузла, водночас використання пам'яті зменшується за відсутності потреби зберігати посилання на дочірні вузли. # --instructions-- Інструкції: Як створити зростаючу купу. Розпочніть із створення методу `insert` за допомогою якого елементи можна додати до купи. Під час вставки важливо завжди підтримувати властивості купи. Щодо незростаючої купи, кореневий елемент дерева має найбільшу вагу, а усі дочірні вузли не перевищують значення батьківських вузлів. Перетворення масиву у незростаючу купу зазвичай відбувається у три етапи: