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

МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ

Київський національний університет імені Тараса Шевченка


Кафедра програмних систем і технологій

Звіт з лабораторної роботи №5


тема: «Дослідження нелінійних структур даних»

Виконав: студент групи ІПЗ - 12


Семенко Тарас Вікторович
Перевірила: викладач
Супрун Ольга Миколаївна

Київ 2019
Завдання:
1. Створити екземпляр бінарного дерева
2. Додати елементи до дерева
3. Вивести вміст дерева у табличному вигляді
4. Знайти та вивести вузли дерева за визначеним критерієм пошуку
5. Знайти та видалити вузли дерева за визначеним критерієм пошуку
6. Вивести вміст дерева у табличному вигляді
Блок-схеми:
Алгоритм додавання елемента:
Алгоритм виведення елементів згідно з заданим способом обходу:
Алгоритм знаходження вузлів за заданим критерієм пошуку:
Алгоритм видалення вузла:
Код:
#include <iostream>
#include <string>
#include <vector>
using namespace std;

struct Student {
string last_name;
string name;
int course;
int student_id;
int grant;
Student(string ll, string nn, int cc, int ss, int gg) {
this->last_name = ll;
this->name = nn;
this->course = cc;
this->student_id = ss;
this->grant = gg;
}
};

ostream& operator<<(ostream& os, Student s) {


cout << "(" << s.name << ", " << s.last_name << ", " << s.course << ", " <<
s.student_id << ", " << s.grant << ")";
return os;
}

class BinaryTree {
public:

struct Node {
Node(Student s) {
this->student = s;
}
Node* left = nullptr;
Node* right = nullptr;
Node* prev = nullptr;
Student student = Student("", "", 0, 0, 0);
};
Node* top = nullptr;

BinaryTree() { }

bool put(Student s) {
if (top == nullptr) {
top = new Node(s);
return true;
}
return insert_node(top, s);
}

bool insert_node(Node* curr, Student s) {


if (s.student_id < curr->student.student_id) {
if (curr->left == nullptr) {
curr->left = new Node(s);
curr->left->prev = curr;
return true;
}
return insert_node(curr->left, s);
}
if (s.student_id > curr->student.student_id) {
if (curr->right == nullptr) {
curr->right = new Node(s);
curr->right->prev = curr;
return true;
}
return insert_node(curr->right, s);
}
return false;
}

void print() {
Student s = prefix_bypass(this->top);
cout << "[" << s.student_id << "]\t- " << s.last_name << ", " << s.name <<
", cource = " << s.course << ", grant = " << s.grant << endl;
}

Student prefix_bypass(Node* n) {
if (n->left) {
Student s = prefix_bypass(n->left);
cout << "[" << s.student_id << "]\t- " << s.last_name << ", " <<
s.name << ", cource = " << s.course << ", grant = " << s.grant << endl;
}
if (n->right) {
Student s = prefix_bypass(n->right);
cout << "[" << s.student_id << "]\t- " << s.last_name << ", " <<
s.name << ", cource = " << s.course << ", grant = " << s.grant << endl;
}
return n->student;
}

void find_and_delete() {
vector<Node*> v;
prefix_bypass(this->top, v);
for (int i = 0; i < v.size(); i++) {
del(v[i]);
}
}

vector<Student> find() {
vector<Node*> v;
prefix_bypass(this->top, v);
vector<Student> vs;
for (int i = 0; i < v.size(); i++) {
vs.push_back(v[i]->student);
}
return vs;
}

void prefix_bypass(Node* n, vector<Node*>& v) {


if (n->left) {
prefix_bypass(n->left, v);
}
if (n->right) {
prefix_bypass(n->right, v);
}
if (n->student.course == 4 && n->student.grant == 0)
v.push_back(n);
}

void del(Node* n) {
if (n->left != nullptr && n->right != nullptr) {
Node* prev = n;
Node* iter = n->right;
while (iter->left != nullptr) {
prev = iter;
iter = iter->left;
}

cout << iter->student.student_id << endl;

if (iter->right != nullptr) {
n->student = iter->student;
n->right = iter->right;
}
else {
n->student = iter->student;
n->right = nullptr;
}
}
else if (n->left != nullptr) {
n->student = n->left->student;
n->right = n->left->right;
n->left = n->left->left;
}
else if (n->right != nullptr) {
n->student = n->right->student;
n->left = n->right->left;
n->right = n->right->right;
}
else {
if (n->prev == nullptr) {
top = nullptr;
return;
}
if (n->prev->left == n) {
n->prev->left = nullptr;
}
else {
n->prev->right = nullptr;
}
}
}
};

int main() {
BinaryTree b;

b.put(Student("Ivanov", "Ivan", 1, 5, 0));


b.put(Student("Lavrinenko", "Vadum", 3, 3, 0));
b.put(Student("Petrenko", "Ivan", 2, 6, 1000));
b.put(Student("Granich", "Vlad", 1, 4, 1600));
b.put(Student("Semencheko", "Taras", 1, 10, 0));
b.put(Student("Averchenko", "Illia", 4, 2, 0));
b.put(Student("Kotov", "Volodymur", 4, 1, 0));
b.put(Student("Sahno", "Sergay", 3, 9, 0));
b.put(Student("Petrunyak", "Valeriy", 2, 4, 1200));
b.put(Student("Ivanenko", "Andrey", 2, 34, 1000));

cout << "Primary BinaryTree: " << endl;


b.print();

vector<Student> vs = b.find();
cout << endl << "Delete:" << endl;
for (int i = 0; i < vs.size(); i++) {
cout << vs[i] << endl;
}

b.find_and_delete();
cout << endl << "After changing: " << endl;
b.print();

cout << endl;

system("pause");
return 0;
}

Робота програми:
Вхідні дані Вихідні дані
"Ivanov" "Ivan" 1 5 0
"Lavrinenko" "Vadum" 3 3 0
"Petrenko" "Ivan" 2 6 1000
"Granich" "Vlad" 1 4 1600
"Semencheko" "Taras" 1 10 0
"Averchenko" "Ilia" 4 2 0
"Kotov" "Volodymur" 4 1 0
"Sahno" "Sergay" 3 9 0
"Petrunyak" "Valeriy" 2 4 1200
"Ivanenko" "Andrey" 2 34 1000
"Petrenko" "Ivan" 2 36 1000
"Semencheko" "Taras" 4 10 0
"Ivanov" "Ivan" 1 55 0
"Kotov" "Volodymur" 4 12 0
"Granich" "Vlad" 1 4 1600
"Averchenko" "Ilia" 4 65 0
"Lavrinenko" "Vadum" 3 3 0
"Ivanenko" "Andrey" 4 54 1000
"Petrunyak" "Valeriy" 2 34 1200
"Sahno" "Sergay" 3 9 0

"Ivanov" "Ivan" 1 5 0
"Kotov" "Volodymur" 4 12 0
"Petrenko" "Ivan" 2 2 1000
"Granich" "Vlad" 1 4 0
"Semencheko" "Taras" 4 8 0
"Sahno" "Sergay" 3 9 0
"Averchenko" "Ilia" 4 4 0
"Lavrinenko" "Vadum" 3 6 0
"Ivanenko" "Andrey" 4 9 0
"Petrunyak" "Valeriy" 2 9 1200

You might also like