Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы и структуры данных / методичка структуры данных_задания.docx
Скачиваний:
54
Добавлен:
12.05.2015
Размер:
381.84 Кб
Скачать

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) – будь - яка дія з кожним вузлом дерева.