- •Лекція 13: Тема: Поняття двобічного (бінарного) дерева. Збалансоване і незбалансоване дерево. Алгоритм обходу двобічного дерева. Алгоритм пошуку за допомогою бінарного дерева
- •Вставка і видалення
- •Мал. 11: Двійкове дерево
- •Мал. 14: Незбалансоване бінарне дерево
- •Вставка і видалення
- •Мал. 20. Бінарне дерево після додавання вузла 18
- •Мал. 23. Бінарне дерево після видалення вузла 20 Контрольні запитання:
- •Література:
Мал. 11: Двійкове дерево
Глибина бінарного дерева - це максимальний рівень листа дерева, що рівне довжині щонайдовшого шляху від кореня до листа дерева.
Отже, глибина дерева на першому малюнку рівна 3.
Повне бінарне дерево рівня n - це дерево, в якому кожен вузол рівня n є листом і кожен вузол рівня менше n має непорожні ліве і праве піддерева
|
Мал. 12.
На мал. 12 приведений приклад повного бінарного дерева рівня 3.
|
Мал. 13
Визначить чи є збалансованими дерева на мал. 13
Є ще один різновид бінарних дерев, який називається впорядковані бінарні дерева.
Впорядковані бінарні дерева - це дерева, в яких для кожного вузла Х виконується правило: у лівому поддереве - ключі, менші Х, в правому поддереве - великі або рівні Х. Наприклад, дерево на мал. 10.
Щоб знайти в такому дереві якесь значення, ми стартуємо з кореня і рухаємося вниз. Наприклад, для пошуку числа 16, ми помічаємо, що 16 < 20, і тому йдемо вліво. При другому порівнянні бачимо, що 16 > 7, і тому ми рухаємося управо. Третя спроба успішна - ми знаходимо елемент з ключем, рівним 16.
Кожне порівняння удвічі зменшує кількість елементів, що залишилися. В цьому відношенні алгоритм схожий на двійковий пошук в масиві. Проте, все це вірно тільки у випадках, коли наше дерево збалансоване. На мал. 14 показано інше дерево, що містить ті ж елементи. Не дивлячись на те, що це дерево теж бінарне, пошук в нім схожий, швидше, на пошук в односвязном списку, час пошуку збільшується пропорційно числу елементів, що запам'ятовуються.
Мал. 14: Незбалансоване бінарне дерево
Структура бінарного дерева побудована з вузлів.
Вузол дерева містить поле даних і два поля з покажчиками.
|
Поля покажчиків називаються лівим покажчиком і правим покажчиком, оскільки вони указують на ліве і праве поддерево, відповідно. Значення nil є ознакою порожнього дерева.
Тоді бінарне дерево можна буде представити в наступному вигляді мал 16.
|
|
Мал. 16.
Дії з бінарними деревами
Розглядаючи дії над деревами, можна сказати, що для побудови дерева необхідно формувати вузли, і, визначивши заздалегідь місце включення, включати їх в дерево. Кількість вузлів визначається необхідністю. Алгоритм включення повинен бути відомий і постійний. Вузли дерева можуть бути використані для зберігання якої-небудь інформації.
Далі необхідно здійснювати пошук заданого вузла в дереві. Це можна організувати, наприклад, послідовно обходячи вузли дерева, причому кожен вузол повинен бути проглянутим тільки один раз.
Може виникнути завдання і знищення дерева в той момент, коли необхідність в нім (у інформації, записаній в його елементах) відпадає. У ряді випадків може потрібно знищення піддерева.
Для того, щоб сукупність вузлів утворила дерево, необхідно якимсь чином формувати і використовувати зв'язки вузлів зі своїми предками і нащадками. Все це дуже нагадує дії над елементами списку.
Побудова бінарного дерева
Важливим поняттям деревовидної структури є поняття двійкового дерева пошуку. Правило побудови двійкового дерева пошуку: елементи, у яких значення деякої ознаки менше, ніж біля кореня, завжди включаються зліва від деякого поддерева, а елементи із значеннями, більшими, ніж біля кореня - справа. Цей принцип використовується і при формуванні двійкового дерева, і при пошуку в нім елементів. Таким чином, при пошуку елементу з деяким значенням ознаки відбувається спуск по дереву, починаючи від кореня, причому вибір гілки наступного кроку - направо або наліво згідно значенню шуканої ознаки - відбувається в кожному черговому вузлі на цьому шляху. При пошуку елементу результатом буде або знайдений вузол із заданим значенням ознаки, або пошук закінчиться листом з «нульовим» посиланням, а необхідний елемент відсутній на пройденому по дереву шляху. Якщо пошук був виконаний для включення чергового вузла в дерево, то в результаті буде знайдений вузол з порожнім посиланням (порожніми посиланнями), до якого справа або зліва відповідно до значення ознаки і буде приєднаний новий вузол.
Розглянемо приклад формування двійкового дерева. Припустимо, що потрібно сформувати двійкове дерево, вузли (елементи) якого мають наступні значення ознаки: 20, 10, 35, 15, 17, 27, 24, 8, 30. У цьому ж порядку вони і поступатимуть для включення в двійкове дерево. Першим вузлом в дереві (коренем) стане вузол із значенням 20. Звернути увагу: пошук місця підключення чергового елементу завжди починається з кореня. До Кореню зліва підключається елемент 10. До Кореню справа підключається елемент 35. Далі елемент 15 підключається справа до 10, проходячи шлях: корінь 20 - наліво - елемент 10 - направо - підключення, оскільки далі за шлях немає. Процес триває до вичерпання елементів, що включаються. Результат представлений на мал. 17.
Мал. 17
Над бінарним деревом є операція - його проходження, тобто потрібно обійти все дерево, відзначивши кожен вузол один раз.
Існує 3 способи обходу бінарного дерева.
у прямому порядку
у симетричному порядку
у зворотному порядку
У прямому порядку:
Потрапити в корінь
Пройти в прямому порядку ліве поддерево
Пройти в прямому порядку праве поддерево
У симетричному порядку:
Пройти в симетричному порядку ліве поддерево
Потрапити в корінь
Пройти в симетричному порядку праве поддерево
У зворотному порядку:
Пройти в зворотному порядку ліве поддерево
Пройти в зворотному порядку праве поддерево
Потрапити в корінь
мал. 18
Мал. 19