
- •Затверджено на засіданні
- •Редактор л.М. Тонкошкур
- •1. Предмет та зміст дисципліни
- •2. Структури даних.
- •2.1 Динамічні структури даних.
- •2.2. Стеки
- •Блок-схема функції push додавання до стеку нового елемента
- •Блок-схема функції pop видалення останнього елемента стеку
- •Варіанти індивідуальних завдань
- •2.3. Списки.
- •Блок-схема програми
- •Варіанти індивідуальних завдань
- •2.4. Черги.
- •Блок-схема програми
- •Варіанти індивідуальних завдань
- •2.5. Дерева.
- •Варіанти індивідуальних завдань
- •4.Алгоритми сортування
- •Варіанти індивідуальних завдань
- •5.Алгоритми пошуку.
- •Лінійний пошук - це пошук підряд в неупорядкованій послідовності.
- •Варіанти індивідуальних завдань
- •6.Алгоритми на графах.
- •Варіанти індивідуальних завдань
- •Список літератури
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);
}
}
Варіанти індивідуальних завдань
Розробити програму побудови двійкового дерева, ключем в якому служить номер залікової книжки, а інфоpмаційна частина - величина рядкового типу, яка містить прізвище студента. Написати функцію, здійснюючу друк побудованого двійкового деpева (номера залікових книжок та прізвища).
Розробити програму побудови двійкового дерева, ключем в якому служить прізвище студента, а інфоpмаційна частина містить номер залікової книжки студента. Написати поцедуpу видалення вузла по ключу в двійковому деpеві.
Розробити програму побудови двійкового дерева, ключем в якому служить назва лікарського засобу, а інфоpмаційна частина - величина дійсного типу, яка містить вартість лікарського засобу в гривнях. Написати функцію, здійснюючу друк побудованого двійкового деpева (назви лікарських засобів та їх варстість).
Розробити програму побудови двійкового дерева, ключем в якому служить назва лікарського засобу, а інфоpмаційна частина - величина дійсного типу, яка містить вартість лікарського засобу в гривнях. Написати поцедуpу видалення вузла по ключу в двійковому деpеві.
Розробити програму побудови двійкового дерева, ключем в якому служить інвентарний номер книги, а інфоpмаційна частина - величина рядкового типу, яка містить назву книги. Написати функцію, здійснюючу друк побудованого двійкового деpева (інвентарні номери та назви книг).
Розробити програму побудови двійкового дерева, ключем в якому служить інвентарний номер книги, а інфоpмаційна частина - величина рядкового типу, яка містить назву книги. Написати поцедуpу видалення вузла по ключу в двійковому деpеві.
Розробити програму побудови двійкового дерева, ключем в якому служить номер студентської групи, а інфоpмаційна частина - величина рядкового типу, яка містить шифр спеціальності. Написати функцію, здійснюючу друк побудованого двійкового деpева (номера студентських груп та шифри спеціальностей).
Розробити програму побудови двійкового дерева, ключем в якому служить номер студентської групи, а інфоpмаційна частина - величина рядкового типу, яка містить шифр спеціальності. Написати поцедуpу видалення вузла по ключу в двійковому деpеві.
Розробити програму побудови двійкового дерева, ключем в якому служить назва дисципліни, а інфоpмаційна частина – кількість годин, запланованих для цієї дисципліни. Написати функцію, здійснюючу друк побудованого двійкового деpева (дисципліни і відповідні години).
Написати програму копіювання одного бінарного (двійкового) дерева в інше.
Написати програму копіювання правих вершин з одного бінарного дерева в інше.
Написати програму копіювання лівих вершин з одного бінарного дерева в інше.
Написати програму обміну правих вершин одного бінарного дерева на відповідні ліві вершини іншого дерева.
Підрахувати кількість лівих вершин в бінарному дереві.
Підрахувати кількість правих вершин в бінарному дереві.
Поміняти місцями інформацію, що містить максимальний і мінімальний ключі.
Підрахувати число листів у дереві (лист – це вузол, у якого немає посилань на інші вузли дерева).
Вилучити з дерева гілку з вершиною, що має заданий ключ.
Визначити кількість символів у всіх рядках, що знаходяться у вузлах дерева.
Визначити число вузлів у дереві, у яких є покажчик тільки на одну гілку.
Визначити число вузлів у дереві, у яких є два потомка.
Визначити кількість записів у дереві, що починаються з певної букви (наприклад «a»).
Знайти середнє значення всіх ключів дерева й вузол, що має найближчий до цього значення ключ.
Знайти вузел із ключем, найближчим до середнього значення між максимальним і мінімальним значеннями ключів.
Визначити кількість вузлів у лівій гілці дерева.
Визначити кількість вузлів у правій гілці дерева.
Знайти суму елементів бінарного дерева.
Написати функцію, яка визначає число входжень елемента x у бінарне дерево.
Знайти максимальний елемент бінарного дерева й кількість повторень максимального елемента в даному дереві.
Написати функцію, яка визначає, чи є в бінарному дереві хоча б два однакові елементи.
3. МЕТОДИ ПОБУДОВИ ЕФЕКТИВНИХ АЛГОРИТМІВ.
3.1. Рекурсія.
Рекурсія – це можливість ввести в визначення об’єкта посилання на сам об’єкт. Рекурсія є одним з фундаментальних концептуальних інструментів, наявних у розпорядженні програміста.
Приклад
Визначити рекурсивну функцію обчислення xn для x>0 і n>0.
Блок-схема програми
Б
так
ні
Текст програми:
#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);
}
Варіанти індивідуальних завдань
Обчисліть добуток елементів масиву: A[1]*A[2]*. . . *A[N] рекурсивним алгоритмом.
Запрограмуйте рекурсивний пошук найменшого елементу масиву.
Обчисліть значення функції Фібоначчі FIB(N) із рекурсивного співвідношення:
FIB(N) = FIB(N-1)+ FIB(N-2).
Послідовність чисел Фібоначчі: 1,1,2,3,5,7,...
4. Визначите рекурсивну функцию, яка визначає, чи являється симетричною частина рядка S, починаючи з i-го елементу і кінчаючи j-м.
5. Обчисліть суму перших N натуральних чисел.
Обчисліть:
Обчисліть:
Запрограмуйте процедуру, яка б друкувала всі перестановки з заданих n cимволів.
Обчисліть:
Обчислити:
Обчислити:
Обчислити:
Обчислити:
Обчислити:
Обчислити:
Обчислити:
Обчислити:
Обчислити:
Обчислити:
Обчислити:
Обчислити середнє значення елементів одновимірного масиву.
Обчислити значення суми S = 1/1! + 1/2! + ... + 1/k!
Написати функцію додавання двох чисел, використовуючи тільки додаток одиниці.
Написати функцію множення двох чисел, використовуючи тільки операцію додавання.
Напишіть рекурсивну функцію, яка обчислює довжину рядка.
У текстовому файлі задана послідовність позитивних чисел, за якою іде негативне число. Написати функцію для знаходження суми цих позитивних чисел.
Підрахувати кількість позитивних чисел у масиві.
Підрахувати кількість парних чисел у масиві.