Дерева бінарного пошуку
Задача
Дерева бінарного пошуку
Дерево бінарного пошуку
Дерево бінарного пошуку
Пошук у дереві бінарного пошуку
Пошук у дереві бінарного пошуку
Пошук у дереві бінарного пошуку
Пошук найменшого значення
Пошук найменшого значення
Побудова дерева бінарного пошуку
Побудова дерева бінарного пошуку
Перевірка дерева бінарного пошуку
Вставка в дерево бінарного пошуку
Вставка в дерево бінарного пошуку
Вилучення з дерева бінарного пошуку
Вилучення з дерева бінарного пошуку
Вилучення з дерева бінарного пошуку
Вилучення з дерева бінарного пошуку
Вилучення з дерева бінарного пошуку
Складність основних дій з деревами бінарного пошуку
Зауваження
Підсумки
Поради
Задачі
Задачі
Задачі
Задачі
212.00K
Category: programmingprogramming

Дерева бінарного пошуку

1. Дерева бінарного пошуку

24.02.2020
Всякая вещь есть форма проявления
беспредельного разнообразия.
Козьма Прутков

2. Задача

Множина S, дії:
вставляти та вилучати елементи;
перевіряти належність елемента множині S;
знаходити найменший (найбільший) елемент S.
Вважаємо, що S є підмножиною лінійно
впорядкованої великої універсальної множини.
Способи представлення множини S ?
Переваги та недоліки розглянутих раніше
способів?

3. Дерева бінарного пошуку

Дерево бінарного пошуку - бінарне дерево,
кожний вузол якого v відмічений значенням l(v)
так що:
l(u) < l(v) для кожного вузла u з лівого
піддерева вузла v;
l(u) > l(v) для кожного вузла u з правого
піддерева вузла v.
Властивість: відмітки вузлів бінарного
дерева, що взяті в симетричному порядку
утворюють впорядковану послідовність.

4. Дерево бінарного пошуку

h
c
a
d
b
g
e
<a, b, c, d, e, f, g, h>
f

5. Дерево бінарного пошуку

Розглянемо основні дії з деревом бінарного
пошуку:
пошук вузла за ключовим значенням;
вставка вузла у дерево бінарного пошуку;
вилучення вузла з дерева бінарного пошуку;
пошук найменшого значення;
побудова дерева бінарного пошуку (повністю
збалансованого) за множиною значень;
перевірка дерева, чи є воно деревом бінарного
пошуку.
Pr_1

6. Пошук у дереві бінарного пошуку

Вхід: дерево Т и ключ K.
Задача: якщо є вузол зі значенням K в дереві Т, то
повернути покажчик на цей вузол.
Алгоритм:
Для порожнього дерева повернути покажчик NULL
Інакше порівняти K зі значенням кореня X:
Якщо K=X, видати покажчик на цей вузол.
Якщо K>X, шукати ключ K в правому піддереві Т.
Якщо K<X, шукати ключ K в лівому піддереві Т.

7. Пошук у дереві бінарного пошуку

//пошук у ДБП рекурсивний
BINTRP find(BINTRP p, int key) {
if (p && p->dat != key)
return(p->dat>key ? find(p->lt, key) :
find(p->rt, key));
return p;
}

8. Пошук у дереві бінарного пошуку

//пошук у ДБП нерекурсивний
BINTRP fnd(BINTRP p, int key) {
while (p) {
if (p->dat > key) p = p->lt;
else if (p->dat < key) p = p->rt;
else break;
}
return p;
}

9. Пошук найменшого значення

//пошук найменшого значення рекурсивний
int fmin(BINTRP p) {
if (p->lt) return (fmin(p->lt));
return (p->dat);
}

10. Пошук найменшого значення

//пошук найменшого значення нерекурсивний
int vmin(BINTRP p) {
while (p->lt) p = p->lt;
return (p->dat);
}

11. Побудова дерева бінарного пошуку

//за даними впорядкованого масиву
BINTRP build(int a[], int n) {
int m;
if (n) {
m = n/2;
return(nwnode(a[m], build(&a[0], m),
build(&a[m+1], n-m-1)));
} return NULL;
}

12. Побудова дерева бінарного пошуку

//формування вузла бінарного дерева
BINTRP nwnode(int v, BINTRP pl, BINTRP pr) {
BINTRP p = new BINTRN;
p->dat = v; p->lt = pl; p->rt = pr;
return p;
}

13. Перевірка дерева бінарного пошуку

//перевірка ДБП, vv зовнішня змінна з малим значенням
bool test(BINTRP p) {
if (!p) return 1;
if (!test(p->lt)) return 0;
if (p->dat < vv) return 0;
vv = p->dat;
return (test(p->rt));
}

14. Вставка в дерево бінарного пошуку

Вхід: дерево Т й значення v.
Задача: додати вузол із значенням v в дерево Т
(якщо такий вузол відсутній).
Алгоритм:
Якщо дерево порожньо, замінити його на дерево з
одним кореневим вузлом (v, NULL, NULL).
Інакше порівняти v із значенням вузла x.
Якщо v<x, рекурсивно додати v в ліве піддерево Т.
Якщо v>x, рекурсивно додати v в праве піддерево Т.

15. Вставка в дерево бінарного пошуку

//вставка нового вузла у ДБП
BINTRP insert(BINTRP p, int v) {
if (!p) return (nwnode(v, NULL, NULL));
if (p->dat > v) p->lt = insert(p->lt, v);
else if (p->dat <v) p->rt = insert(p->rt, v);
return p;
}

16. Вилучення з дерева бінарного пошуку

a)
T0
T0
v
T1
T1

17. Вилучення з дерева бінарного пошуку

b)
T0
T0
y
v
T2
T1
T2
T1
y
T3
???
T3

18. Вилучення з дерева бінарного пошуку

Вхід: дерево Т й ключ v.
Задача: вилучити з дерева Т вузол із значенням v.
Алгоритм:
Якщо дерево T порожнє, зупинитись;
Інакше порівняти v з значенням x кореневого вузла.
Якщо v>x, рекурсивно вилучити v з правого піддерева Т;
Якщо v<x, рекурсивно вилучити v з лівого піддерева Т;
Якщо v=x, то необхідно розглянути два випадки.
Якщо вузол має не більше одного сина його вилучаємо;
Якщо вузол має двох синів, то
Знайдемо вузол із значенням y, що йому безпосередньо
передує у симетричному обході, здійснюємо заміну v←y й
вилучаємо вузол зі значенням y.

19. Вилучення з дерева бінарного пошуку

//вилучення вузла з ДБП
BINTRP ndel(BINTRP p, int v) {
BINTRP q;
if (p)
{if (p->dat > v) p->lt = ndel(p->lt, v);
else if (p->dat < v) p->rt = ndel(p->rt, v);
else if (p->lt) p->lt = delmax(p->lt, p);
else {q = p; p = p->rt; delete q;}
} return p;
}

20. Вилучення з дерева бінарного пошуку

//пошук вузла з максимальним значенням у ДБП й
//вилучення, після пересилання його значення у вузол t
BINTRP delmax(BINTRP p, BINTRP t) {
BINTRP q;
if (p->rt) p->rt = delmax(p->rt, t);
else {t->dat = p->dat; q = p; p = p->lt; delete q;}
return p;
}

21. Складність основних дій з деревами бінарного пошуку

Витрати пам`яті – O(n).
Часова складність для всіх дій - O(h):
“в середньому” - O(log n);
“в найгіршому” - O(n) (h може дорівнювати n).
Де n – кількість вершин, а h – висота дерева.

22. Зауваження

Не складно, за час O(n), побудувати ідеальне –
повністю збалансоване дерево бінарного пошуку
з висотою O(log n), що представляє впорядковану
сукупність даних.
Але дії з деревом: додавання та вилучення
можуть
порушувати
“збалансованість”,
поступово перетворюючи його на дерево з
висотою O(n). При цьому структура стає схожою
на список й втрачає основні свої привабливі
риси.

23. Підсумки

Дерева бінарного пошуку виступають у ролі
досить привабливої структури даних для
представлення
різноманітної
інформації,
наприклад, таблиць з ключовими полями (за
якими
здійснюється
впорядкування)
й
підтримують ефективне виконання основних
операцій: пошуку, додавання, вилучення.
Часова складність основних дій з деревами
бінарного пошуку визначається висотою дерева.

24. Поради

Розібратися
з розглянутими можливостями
обробки інформації, представленої деревами
бінарного пошуку.
Не зловживати рекурсією.
Самостійно реалізувати інші дії з інформацією,
що представлена деревами бінарного пошуку.

25. Задачі

Написати функції для визначення найбільшого
значення у вузлах непорожнього дерева
бінарного пошуку (рек., нерек.).
Задана послідовність цілих чисел a1, a2, …, an .
Написати програму модифікації дерева бінарного
пошуку B, спочатку порожнього, за умовами:
– якщо ai>0 , то додати ai в B;
– якщо ai<0 , то вилучити -ai з B (при відсутності
видається повідомлення);
– якщо ai=0 , то закінчити виконання програми.

26. Задачі

Написати нерекурсивні функції для вставки та
вилучення елементів.
Записати у файл відмітки вузлів дерева
бінарного пошуку у порядку їх зростання.
У текстовому файлі PROG – “Сі-програма”, з
ідентифікаторами довжиною не більше 9.
Надрукувати в алфавітному порядку всі
ідентифікатори, вказавши кількість входжень
(великі й маленькі літери розрізняються).

27. Задачі

Розв`язати попередню задачу, але разом з
ідентифікатором друкувати у зростаючому
порядку номери всіх рядків тексту програми, де
він зустрічається.
Розв`язати попередні задачі, якщо максимальна
довжина ідентифікаторів заздалегідь не відома.
Написати функцію для розбиття дерева
двійкового пошуку на два зі значеннями у
деревах відповідно <K та ≥K.

28. Задачі

Написати
функцію для об`єднання двох
множин представлених деревами двійкового
пошуку. Результатом є дерево двійкового
пошуку.
Написати функцію для об`єднання двох дерев
двійкового пошуку зі значеннями у деревах
відповідно <K та ≥K.
Як на вашу думку можна виправляти
“незбалансованість” дерев двійкового пошуку?
English     Русский Rules