Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metod_pract_KDM_2007[1].doc
Скачиваний:
3
Добавлен:
01.04.2025
Размер:
4.2 Mб
Скачать

18.3 Приклади розв’язання типових завдань

1. Написати код дерева Т (рис. 18.1).

Рисунок 18.1

Дано дерево, вершини якого пронумеровано по порядку. Кількість вершин р = 11. Зайдемо усі його висячі вершини: 4 5 6 7 9 10. Мінімальною з них є 4, видаляємо її, разом із суміжним до неї ребром, а у код записуємо 3. Знов знаходимо висячі вершини: 5 6 7 9 10. Видаляємо мінімальну з них – 5. У код записуємо 12. Тепер висячими вершинами є 6 7 9 10. Видаляємо вершину 6, а в код записуємо – 11. Повторюємо видалення вершин доти, доки від дерева не залишиться тільки одне ребро – (1, 12). Зараз код містить (р–2) вершин, тобто 9. На цьому процес видалення вершин закінчується. Код даного дерева: 3 12 11 2 12 8 1 2 3 1.

2. Використовуючи алгоритм декодування дерев, отримати дерево за кодом: 2 4 2 3 1 2.

Всього вершин р = 8 (тому що у коді міститься 6 елементів).

Знаходимо висячі вершини: 5 6 7 8.

З'єднуємо вершини 5–2; вершина 2 ще зустрічається в коді, тому переходимо до другої висячої вершини – 4, вона є мінімальною, тому виконуємо те саме і для неї (рис. 18.2). Тепер маємо дві з'єднані вершини: (5 – 2) і (4 – 6). Як бачимо, вершина "4" більше не зустрічається в коді, тому робимо її висячою і змінюємо її колір (рис. 18.3). Тепер 4 – лист з мінімальним номером, тому з’єднуємо його з наступним елементом коду (рис. 18.4). Лист 7 стає мінімальним, з’єднуємо його з наступним елементом коду – 3, який робимо висячим (рис. 18.5). На наступному кроці 3 – мінімальний лист, виконуємо пункт (3), одиницю переносимо у список висячих вершин (рис. 18.6). За аналогією виконуємо наступний крок (рис. 18.7). У списку висячих вершин залишилося дві не з’єднані: 8 та 2 (крок 7). З’єднавши їх, отримуємо дерево (рис.18.8).

Рисунок 18.2

Рисунок 18.3

Рисунок 18.4

Рисунок 18.5

Рисунок 18.6

Рисунок 18.7

Рисунок 18.8

3. Зазначити послідовність відвідування вершин дерева, зображеного на рис. 18.9 при префіксному (прямому), інфіксному (кінцевому) та постфіксному (оберненому) обходах.

Рисунок 18.9

а) Обійдемо задане дерево за алгоритмом PreOrder (прямий обхід).

Починаємо з кореня дерева – вершини V1. Позначимо її номером 1. Рекурсивно здійснимо прямий обхід її лівого піддерева. Тобто наступною позначаємо вершину V2, для якої також здійснемо прямий обхід лівого піддерева. Номером 3 позначаємо вершину V4. У вершині V4 немає лівого піддерева, здійснюємо прямий обхід її правого піддерева – номером 4 позначаємо вершину V7. У вершині V7 немає нащадків, тому повертаємося до вершини V4. Ця вершина вже позначена, повертаємося до вершини V2. Здійснюємо прямий обхід правого її піддерева – номером 5 позначаємо вершину V5. Аналогічно проходимо інші вершини заданого дерева. Порядок проходження вершин даного дерева буде таким, як зображено на рис. 18.10;

б) Обійдемо задане дерево за алгоритмом PostOrder (обернений обхід).

Починаємо з кореня дерева – вершини V1. Здійснимо обернений обхід її лівого піддерева – відвідаємо вершину V2, для якої також здійснюємо обернений обхід лівого піддерева. Визначимо, що ще жодна вершина не позначена. Наступною відвідуємо вершину V4, так само рекурсивно здійснюємо обернений обхід її лівого піддерева. Оскільки лівого нащадка у цієї вершини немає, то здійснюємо обхід її правого піддерева – відвідуємо вершину V7. Запускаємо алгоритм PostOrder і для неї. Оскільки у неї немає нащадків, то позначаємо цю вершину номером 1. Повертаємося на крок назад, до вершини V4. Всі її нащадки вже пройдені, тому позначаємо її номером 2. Аналогічно повертаємося ще на крок назад та відвідуємо праве піддерево вершини V2. Вершину V5 позначаємо номером 3 і знов повертаємось назад. За аналогією, проходимо праве піддерево вершини V1, після чого отримуємо результат (рис. 18.11);

в) Обійдемо задане дерево за алгоритмом SyntOrder (кінцевий обхід).

Як і при оберненому обході, необхідно опуститися на «саме дно» дерева, а потім розпочати позначати його вершини. Але спочатку позначається лівий нащадок вершини, потім – сама вершина, і тільки після цього правий нащадок. Тому номером 1 позначаємо вершину V4. Після неї позначаємо вершину V7 номером 2, потім, за аналогією з оберненим обходом, повертаємося на крок назад і позначаємо номером 3 вершину V2. Потім здійснюємо обхід правого піддерева вершини V2 – позначаємо вершину V5 номером 4. Аналогічно проходимо частину заданого дерева, що залишилася. Нарешті маємо результат (рис.18.12).

Рисунок 18.10

Рисунок 18.11

Рисунок 18.12