
- •1. Сортування
- •1.1. Сортування масивів
- •1. Сортування простими включеннями;
- •2. Сортування простим вибором;
- •1.1.1. Сортування простими включеннями
- •1.1.2. Сортування простим вибором
- •1.1.3. Сортування простим обміном (засіб “бульбашки”)
- •1.1.4. Шейкер-сортування
- •1.1.5. Швидке сортування
- •1.2. Сортування масива рядків
- •1.3. Сортування файлів
- •2. Рекурсивні алгоритми
- •2.1. Алгоритми з поверненням
- •2.1.1. Шахова задача про хід коня
- •2.1.2. Шахова задача про вісім ферзів
- •3. Динамічні інформаційні структури
- •3.1. Динамічні змінні. Вказівники
- •3.1.1. Засоби створення та використання динамічних даних
- •3.2. Рекурсивні типи даних
- •3.3. Списки
- •3.3.2. Двозв’язні та кiльцевi списки
- •3.3.3. Черги і стеки
- •3.4. Деревовидні структури
- •3.4.1. Бінарні дерева
- •3.4.2. Ідеально збалансовані дерева
- •3.4.3. Дерева пошуку
- •3.4.4. Збалансовані дерева (авл-дерева)
- •4. Завдання до лабораторних та контрольних робіт.
- •4.1. Сортування.
- •4.2. Списки.
3.4. Деревовидні структури
За допомогою структури, яка складається з записів, пов’язаних між собою системою вказівників (причому кожний запис може вміщувати в собі вказівник на декілька записів), можна представити спрямований граф.
Записи – вершини, або вузли.
Вказівники – ребра, або гілки.
Окремий випадок графу – дерево.
де:
A – корінь
А,Б,В,Ж – вершини, або вузли
Г,Д,Е,З,І,К – листки
А Б \
А В – ребра, або гілки
Б Г /
….
Дерево, як і список, є рекурсивною структурою.
Список можна визначити наступним чином: список може бути або порожнім, або складається з вузла (елемента списку), який містить в собі вказівник на список.
Дерево – або порожнє, або складається з вузла, який містить вказівники на дерева, що не перехрещуються.
Списки можна з однаковою легкістю обробляти як рекурсивними, так і ітеративними алгоритмами.
Дерева набагато легше обробляти за допомогою рекурсивних алгоритмів.
Список також має назву виродженого дерева.
Верхній вузол дерева має назву корінь дерева.
Вузел y, який знаходиться безпосередньо під вузлом x має назву (безпосереднього) нащадка x. Якщо x знаходиться на рівні i, то y знаходиться на рівні i+1. Вузел x по відношенню до вузла y має назву (безпосереднього) предка.
Корiнь дерева розміщений на рівні 1. Максимальний рівень, на якому знаходиться елемент (найнижчий) має назву глибини або висоти дерева.
Елемент, який немає нащадків, називається термінальним, або листком.
Елемент, який не є термінальним, має назву внутрішнього вузла.
Кількість безпосередніх нащадків внутрішнього вузла має назву його степеня.
Максимальна степінь усіх вузлів є степінь дерева. (Не сумарна, а максимальна кількість нащадків при будь - якому вузлі).
Кількість гілок, чи ребер, які треба пройти, щоб попасти від кореня до вузла x, має назву довжини шляху до x.
Корiнь має довжину шляху 1, його безпосередні нащадки – 2, і т.д.
Довжина шляху дерева – сума довжин шляхів усіх його вузлів.
Вважається, що всі вузли повинні мати максимальну степінь дерева. Якщо безпосередніх нащадків менше, вважається, що вузол має нульові піддерева, порожні гілки.
Дерево є упорядкованою структурою, гілки вузлів розташовані у визначеному порядку, і тому дерева:
це два по - різному упорядкованих дерева.
3.4.1. Бінарні дерева
Упорядковані дерева степені 2 мають назву бінарних.
Бінарне дерево являє собою структуру кінцевої множини елементів (вузлів), кожен з яких або порожній, або складається з кореня (вузла), пов’язаного з двома різними бінарними деревами, які мають назву лівого та правого піддерев.
Приклади бінарного дерева:
– генеалогічне дерево (людина, її батьки як нащадки дерева);
– історія тенісного турніру, де вузлом є кожна гра переможців: піддерева – дві попередні гри;
– арифметичні вирази з двомістними операндами, де кожна операція – вузол, операнди – піддерева.
Наприклад, вираз (a+b/c)*(d-e*f) можна подати у вигляді дерева:
Опис такого дерева:
Type
ref = ^node;
node = Record
op : char;
left : ref;
right: ref
End;
Схематично дерево, подане як структура, має вигляд:
Основні операції з бінарними деревами
Одна з найбільш розповсюджених задач на деревовидній структурі – виконання будь-якої операції з кожним вузлом дерева, для чого необхідно відвідати кожен вузол, тобто виконати обхід дерева.
Нехай R – корінь;
A – ліве піддерево;
B – праве піддерево.
Можливі 3 варианти рекурсивного обходу дерева:
1. Зверху вниз – R, A, B.
2. Зліва направо – A, R, B.
3. Знизу вверх – A, B, R.
Якщо виписати символи, які знаходяться у вузлах розглянутого вище дерева, яке являє собою арифметичний вираз, отримаємо послідовності:
1. Зверху вниз — *+a/bc-d*ef — префіксна форма
2. Зліва направо — a+b/c*d-e*f — інфіксна форма
3. Знизу вверх — abc/+def*-* — постфіксна форма
Ці три варианти рекурсивного обходу можна сформулювати у вигляді рекурсивних процедур:
Procedure PreOrder (t:ref);
Begin
If t<>Nil Then
Begin
P(t);
PreOrder (t^.left);
PreOrder (t^.right);
End
End;
Procedure InOrder (t:ref);
Begin
If t<>Nil Then
Begin
InOrder (t^.left);
P(t);
InOrder (t^.right)
End
End;
Procedure PostOrder (t:ref);
Begin
If t<>Nil Then
Begin
PostOrder (t^.left);
PostOrder (t^.right);
P(t)
End
End;
де - P(t) – будь - яка дія з кожним вузлом дерева.