Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МетодичкаТ Алгор2012.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
472.06 Кб
Скачать

2.5. Дерева.

Дерева – це вид орієнтованого графа. Двійкові (бінарні) дерева використовують для сортування і пошуку даних.

Кожен елемент (вузол) дерева являє собою запис виду:

struct node

{ float num //ключове поле

//інформаційні поля

node *left; // покажчик на лівий елемент

node *right; // покажчик на правий елемент

};

ПРИКЛАД

Організувати дані у вигляді дерева. Вивести на екран елементи дерева з одночасним видаленням із пам’яті.

Текст програми:

#include <iostream.h>

struct node

{

int d;

node *left;

node *right;

};

node * first(int d);

node * search_insert(node *root, int d);

void print_tree(node *root, int l);

void main()

{

int n, i, what;

cout<<"input n \n";

cin>>n;

cout<<"input first what \n";

cin>>what;

node *root = first(what);

for (i = 1; i<n; i++)

{

cout<<"input what \n";

cin>>what;

search_insert(root, what);

}

print_tree(root, 0);

}

node * first(int d)

{

node *pv = new node;

pv->d = d;

pv->left = 0;

pv->right = 0;

return pv;

}

node * search_insert(node *root, int d)

{

node *pv = root, *prev;

int found = 0;

while (pv && !found)

{

prev = pv;

if (d == pv->d) found = 1;

else if (d < pv->d)pv = pv->left;

else pv = pv->right;

}

if (found) return pv;

node *pnew = new node;

pnew->d = d;

pnew->left = 0;

pnew->right = 0;

if (d < prev->d)

prev->left = pnew;

else

prev->right = pnew;

return pnew;

}

void print_tree(node *p, int level)

{

if (p)

{

print_tree(p->left, level+1);

for (int i = 0; i<level; i++)

cout << " ";

cout << p->d << endl;

print_tree(p->right, level + 1);

}

}

Варіанти індивідуальних завдань

  1. Розробити програму побудови двійкового дерева, ключем в якому служить номер залікової книжки, а інфоpмаційна частина - величина рядкового типу, яка містить прізвище студента. Написати функцію, здійснюючу друк побудованого двійкового деpева (номера залікових книжок та прізвища).

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

  3. Розробити програму побудови двійкового дерева, ключем в якому служить назва лікарського засобу, а інфоpмаційна частина - величина дійсного типу, яка містить вартість лікарського засобу в гривнях. Написати функцію, здійснюючу друк побудованого двійкового деpева (назви лікарських засобів та їх варстість).

  4. Розробити програму побудови двійкового дерева, ключем в якому служить назва лікарського засобу, а інфоpмаційна частина - величина дійсного типу, яка містить вартість лікарського засобу в гривнях. Написати поцедуpу видалення вузла по ключу в двійковому деpеві.

  5. Розробити програму побудови двійкового дерева, ключем в якому служить інвентарний номер книги, а інфоpмаційна частина - величина рядкового типу, яка містить назву книги. Написати функцію, здійснюючу друк побудованого двійкового деpева (інвентарні номери та назви книг).

  6. Розробити програму побудови двійкового дерева, ключем в якому служить інвентарний номер книги, а інфоpмаційна частина - величина рядкового типу, яка містить назву книги. Написати поцедуpу видалення вузла по ключу в двійковому деpеві.

  7. Розробити програму побудови двійкового дерева, ключем в якому служить номер студентської групи, а інфоpмаційна частина - величина рядкового типу, яка містить шифр спеціальності. Написати функцію, здійснюючу друк побудованого двійкового деpева (номера студентських груп та шифри спеціальностей).

  8. Розробити програму побудови двійкового дерева, ключем в якому служить номер студентської групи, а інфоpмаційна частина - величина рядкового типу, яка містить шифр спеціальності. Написати поцедуpу видалення вузла по ключу в двійковому деpеві.

  9. Розробити програму побудови двійкового дерева, ключем в якому служить назва дисципліни, а інфоpмаційна частина – кількість годин, запланованих для цієї дисципліни. Написати функцію, здійснюючу друк побудованого двійкового деpева (дисципліни і відповідні години).

  10. Написати програму копіювання одного бінарного (двійкового) дерева в інше.

  11. Написати програму копіювання правих вершин з одного бінарного дерева в інше.

  12. Написати програму копіювання лівих вершин з одного бінарного дерева в інше.

  13. Написати програму обміну правих вершин одного бінарного дерева на відповідні ліві вершини іншого дерева.

  14. Підрахувати кількість лівих вершин в бінарному дереві.

  15. Підрахувати кількість правих вершин в бінарному дереві.

  16. Поміняти місцями інформацію, що містить максимальний і мінімальний ключі.

  17. Підрахувати число листів у дереві (лист – це вузол, у якого немає посилань на інші вузли дерева).

  18. Вилучити з дерева гілку з вершиною, що має заданий ключ.

  19. Визначити кількість символів у всіх рядках, що знаходяться у вузлах дерева.

  20. Визначити число вузлів у дереві, у яких є покажчик тільки на одну гілку.

  21. Визначити число вузлів у дереві, у яких є два потомка.

  22. Визначити кількість записів у дереві, що починаються з певної букви (наприклад «a»).

  23. Знайти середнє значення всіх ключів дерева й вузол, що має найближчий до цього значення ключ.

  24. Знайти вузел із ключем, найближчим до середнього значення між максимальним і мінімальним значеннями ключів.

  25. Визначити кількість вузлів у лівій гілці дерева.

  26. Визначити кількість вузлів у правій гілці дерева.

  27. Знайти суму елементів бінарного дерева.

  28. Написати функцію, яка визначає число входжень елемента x у бінарне дерево.

  29. Знайти максимальний елемент бінарного дерева й кількість повторень максимального елемента в даному дереві.

  30. Написати функцію, яка визначає, чи є в бінарному дереві хоча б два однакові елементи.

3. МЕТОДИ ПОБУДОВИ ЕФЕКТИВНИХ АЛГОРИТМІВ.

3.1. Рекурсія.

Рекурсія – це можливість ввести в визначення об’єкта посилання на сам об’єкт. Рекурсія є одним з фундаментальних концептуальних інструментів, наявних у розпорядженні програміста.

Приклад

Визначити рекурсивну функцію обчислення xn для x>0 і n>0.

Блок-схема програми

Блок-схема функції EX

так

ні

Текст програми:

#include <iostream.h>

int EX(int, int);

void main()

{

int x,n;

cout<<”input x,n”<<endl;

cin>>x>>n;

cout<<”Result:”<<endl;

cout<<EX(x, n)<<endl;

}

int EX(int x, int n)

{

if (n==0)

return 1;

else

return EX(x, n-1);

}

Варіанти індивідуальних завдань

  1. Обчисліть добуток елементів масиву: A[1]*A[2]*. . . *A[N] рекурсивним алгоритмом.

  2. Запрограмуйте рекурсивний пошук найменшого елементу масиву.

  3. Обчисліть значення функції Фібоначчі FIB(N) із рекурсивного співвідношення:

  4. FIB(N) = FIB(N-1)+ FIB(N-2).

  5. Послідовність чисел Фібоначчі: 1,1,2,3,5,7,...

  6. 4. Визначите рекурсивну функцию, яка визначає, чи являється симетричною частина рядка S, починаючи з i-го елементу і кінчаючи j-м.

  7. 5. Обчисліть суму перших N натуральних чисел.

  8. Обчисліть:

  9. Обчисліть:

  10. Запрограмуйте процедуру, яка б друкувала всі перестановки з заданих n cимволів.

  11. Обчисліть:

  12. Обчислити:

  13. Обчислити:

  14. Обчислити:

  15. Обчислити:

  16. Обчислити:

  17. Обчислити:

  18. Обчислити:

  19. Обчислити:

  20. Обчислити:

  21. Обчислити:

  22. Обчислити:

  23. Обчислити середнє значення елементів одновимірного масиву.

  24. Обчислити значення суми S = 1/1! + 1/2! + ... + 1/k!

  25. Написати функцію додавання двох чисел, використовуючи тільки додаток одиниці.

  26. Написати функцію множення двох чисел, використовуючи тільки операцію додавання.

  27. Напишіть рекурсивну функцію, яка обчислює довжину рядка.

  28. У текстовому файлі задана послідовність позитивних чисел, за якою іде негативне число. Написати функцію для знаходження суми цих позитивних чисел.

  29. Підрахувати кількість позитивних чисел у масиві.

  30. Підрахувати кількість парних чисел у масиві.