Professional Documents
Culture Documents
Приклад звіту
Приклад звіту
Київ 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;
}
};
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);
}
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 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;
}
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;
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();
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