Professional Documents
Culture Documents
Лекція 7 Бінарні дерева
Лекція 7 Бінарні дерева
і алгоритми комп'ютерної
обробки інформації
Лекції Бичкова Олексія
КРАХ ОСВІТИ – ЦЕ КРАХ
НАЦІЇ
Зміст
• Бінарні дерева пошуку
Бінарні дерева пошуку
Бінарне дерево - це ієрархічна структура
даних, в якій кожен вузол зберігає значення
та посилання на лівого та правого нащадка.
Бінарні дерева пошуку
Бінарне дерево пошуку - це бінарне дерево,
що має додаткові властивості: значення
лівого нащадка менше значення батька, а
значення правого нащадка більше значення
батька для кожного вузла дерева.
Тобто дані в бінарному дереві пошуку
зберігаються у відсортованому вигляді.
Бінарні дерева пошуку
Бінарні дерева пошуку
Бінарне дерево може бути представлено за допомогою
зв'язаної структури даних, у якій кожен вузол є
об'єктом. На додаток до атрибута ключа key і супутніх
даних кожен вузол містить атрибути left, right і
parent, які вказують на лівий і правий дочірні вузли і
батьківський вузол відповідно. Якщо дочірній або
батьківський вузол відсутні, поле містить значення
NUL. Єдиний вузол, вказівник якого дорівнює NUL, -
це кореневий вузол дерева.
Бінарні дерева пошуку
Тоді властивості бінарного дерева пошуку
запишуться так:
Нехай x є вузол бінарного дерева пошуку.
Якщо y є вузлом у лівому піддереві x, то
y.key<x.key. Якщо y є вузлом у правому
поддереві x, то y.key>x.key.
Бінарні дерева пошуку
Ця властивість дозволяє вивести всі ключі,
що знаходяться у дереві, у відсортованому
порядку за допомогою простого
рекурсивного алгоритму, що називається
центрованим (симетричним) обходом дерева.
Бінарні дерева пошуку
Цей алгоритм отримав дану назву у зв'язку з
тим, що ключ у корені піддерева виводиться
між значеннями ключів лівого піддерева та
правого піддерева.
Бінарні дерева пошуку
INORDER-TREE-WALK (x)
if (x != NUL)
INORDER-TREE-WALK (x.left)
print x.key
INORDER-TREE-WALK (x.right)
Бінарні дерева пошуку
Для бінарного дерева
отримаємо
2, 5, 5, 6, 7, 8
Бінарні дерева пошуку
Для обходу дерева з n вузлами потрібен час
Θ(n), оскільки після початкового виклику
процедура викликається рівно два рази для
кожного вузла дерева: один раз - для його
лівого дочірнього вузла і один раз - для
правого.
Бінарні дерева пошуку
Для обходу дерева з n вузлами потрібен час
Θ(n), оскільки після початкового виклику
процедура викликається рівно два рази для
кожного вузла дерева: один раз - для його
лівого дочірнього вузла і один раз - для
правого.
Пошук у бінарному дереві
TREE-SEARCH (x, k)
if (х == NUL або k == x.key)
return x
if (k<x.key)
return TREE-SEARCH(x.left, k)
else return TREE-SEARCH (x.right, k)
Пошук у бінарному дереві
Вузли, які ми проходимо при рекурсивному
пошуці, утворюють простий низхідний шлях
від кореня дерева, тому час роботи
процедури TREE-SEARCH дорівнює О(h), де
h — висота дерева.
Пошук у бінарному дереві
Цю процедуру можна записати ітеративно,
"розгорнувши" кінцеву рекурсію в цикл
while:
Пошук у бінарному дереві
ITERATIVE-TREE-SEARCH (Х, k)
while (x != NUL і k != x.key)
if (k<х.key)
х = х.left
else x = x.right
return x
Пошук у бінарному дереві
Мінімум та максимум
Елемент з мінімальним значенням ключа
завжди можна знайти, слідуючи за
дочірними вказівниками left від кореневого
вузла, доки не зустрінеться значення NUL.
Пошук у бінарному дереві
TREE-MINIMUM(х)
while (х.left != NUL)
x = x.left
return x