Lab 6 19

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 14

Прізвище:

Ім'я:
Група:
Варіант: 19
Дата захисту:

Кафедра: САПР
Дисципліна: Алгоритмізація та програмування. Ч.2
Перевірив: Артищук І.В.

ЗВІТ
до лабораторної роботи №6
на тему "СТВОРЕННЯ I ВЕДЕННЯ ЗБАЛАНСОВАНИХ БІНАРНИХ ДЕРЕВ "

Мета роботи: ознайомитися iз способом подання даних в оперативнiй пам'ятi ЕОМ у


виглядi збалансованих бінарних (АВЛ) дерев. Оволодiти методами роботи iз
збалансованими бінарними деревами.

Індивідуальне завдання:
19.Написати програму, яка створює збалансоване бінарне дерево. Тип
інформаційного поля char. Написати процедуру, яка знаходить середнє арифметичне
елементів дерева.
Код програми:
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <queue>
using namespace std;

class Node
{
public:
int key;
Node* left;
Node* right;
int height;
int val;
};

int max(int a, int b);

int height(Node* N)
{
if (N == NULL)
return 0;
return N->height;
}

int max(int a, int b)


{
return (a > b) ? a : b;
}
Node* newNode(int key)
{
Node* node = new Node();
node->key = key;
node->left = NULL;
node->right = NULL;
node->height = 1;
return(node);
}

Node* rightRotate(Node* y)
{
Node* x = y->left;
Node* T2 = x->right;

x->right = y;
y->left = T2;

y->height = max(height(y->left),
height(y->right)) + 1;
x->height = max(height(x->left),
height(x->right)) + 1;

return x;
}

Node* leftRotate(Node* x)
{
Node* y = x->right;
Node* T2 = y->left;

y->left = x;
x->right = T2;

x->height = max(height(x->left),
height(x->right)) + 1;
y->height = max(height(y->left),
height(y->right)) + 1;

return y;
}

int getBalance(Node* N)
{
if (N == NULL)
return 0;
return height(N->left) - height(N->right);
}

Node* insert(Node* node, int key)


{

if (node == NULL)
return(newNode(key));

if (key < node->key)


node->left = insert(node->left, key);
else if (key > node->key)
node->right = insert(node->right, key);
else
return node;

node->height = 1 + max(height(node->left),
height(node->right));
int balance = getBalance(node);

if (balance > 1 && key < node->left->key)


return rightRotate(node);

if (balance < -1 && key > node->right->key)


return leftRotate(node);

if (balance > 1 && key > node->left->key)


{
node->left = leftRotate(node->left);
return rightRotate(node);
}

if (balance < -1 && key < node->right->key)


{
node->right = rightRotate(node->right);
return leftRotate(node);
}

return node;
}

void preOrder(Node* root)


{
if (root != NULL)
{
cout << root->key << " ";
preOrder(root->left);
preOrder(root->right);
}
}

int getSum(Node* root, int& elements)


{
++elements;
int sum = root->key;
if (root->left != NULL)
sum += getSum(root->left, elements);
if (root->right != NULL)
sum += getSum(root->right, elements);
return sum;
}

int getAverage(Node* root)


{
int sum = 0;
int elements = 0;
sum = getSum(root, elements);
return sum / elements + 1;
}

int main()
{
Node* root = NULL;

root = insert(root, 9);


root = insert(root, 2);
root = insert(root, 1);
root = insert(root, 3);
root = insert(root, 4);
cout << "AVL tree:\n";
preOrder(root);
cout << "\n";
cout << "Average: ";
cout << getAverage(root);

return 0;
}
Результат:

Блок-схеми:
Висновок: ознайомився iз способом подання даних в оперативнiй пам'ятi ЕОМ у
виглядi збалансованих бінарних (АВЛ) дерев. Оволодiв методами роботи iз
збалансованими бінарними деревами.

Відповіді на контрольні запитання:


1. Які дерева називаються виродженими?
Бінарне дерево, де кожен вузол має лище один дочірній вузол.
2. Яке бінарне дерево називається ідеально збалансованим?
Дерево у якому всі його внутрішні вузли мають двох дітей та всі листові вузли
знаходяться на одному рівні.
3. Як можна оцiнити кiлькiсть варiантiв структур бiнарних дерев? Скільки серед
них будуть ідеально збалансованими?
Піддерево — частина деревоподібної структури даних, яка може бути
представлена у вигляді окремого дерева. Будь-який вузол дерева разом з усіма
його вузлами-нащадками є піддеревом дерева. Для будь-якого вузла піддерева
або має бути шлях в кореневий вузол цього піддерева, або сам вузол повинен
бути кореневим.
Кiлькiсть варiантiв структур бiнарних дерев можна приблизно оцiнити за
допомогою формули Стирлiнґа: 4 n /n*3/2
4. Чому на практиці ідеально збалансовані дерева пошуку використовуються
рідко?
Тому що умова збереження ідеально збалансованого дерева доволі складна
для виконання на практиці і може вимагати значної перебудови дерева при
додаванні або видаленні елементів.
5. Що таке АВЛ-дерево?
Дерево AVL - це бінарне дерево із збалансованою висотою. Кожен вузол
асоціюється із збалансованим коефіцієнтом, який обчислюється як різниця між
висотою його лівого піддерева та правого піддерева.
6. Як визначити показник зблансованостi вузла?
Щоб дерево було збалансованим, збалансований коефіцієнт для кожного вузла
повинен бути від -1 до 1. Якщо це не так, дерево стане незбалансованим. Для
цього потрібно прирівняти висоту лівого піддерева з правим.
7. Як здiйснюється додавання вузла до АВЛ-дерева? Як виконуються процедури
збалансування?
Вставка нового ключа в АВЛ-дерево виконується, за великим рахунком, так
само, як це робиться в простих деревах пошуку: спускаємося вниз по дереву,
вибираючи правої чи лівої напрямок руху в залежності від результату
порівняння ключа в поточному вузлі і вставляється ключа. Єдина відмінність
полягає в тому, що при поверненні з рекурсії (тобто після того, як ключ
вставлений або в праве, або в ліве піддерево, і це дерево збалансоване)
виконується балансування поточного вузла.
У процесі додавання або видалення вузлів в АВЛ-дереві можливе виникнення
ситуації, коли balance factor деяких вузлів виявляється рівними 2 або -2, тобто
виникає разбалансування піддерева. Для виправлення ситуації застосовуються
добре нам відомі повороти навколо тих чи інших вузлів дерева
8. Як здiйснюється видлення вузла з АВЛ-дерева?
Якщо вершина − листок, тоді видалимо її і викличемо балансування всіх її
предків в порядку від батька до кореня. Інакше знайдемо найближчу за
значенням вершину «заміну» у піддереві найбільшої висоти (правому або
лівому) і перемістимо її на місце вершини, що видаляється, при цьому
викликавши процедуру її видалення (зворотний обхід дерева відбувається від
батька «заміни»). Безпосередньо після видалення елементу − «заміна» отримує
баланс вузла, що видаляється

You might also like