Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

17_Лабораторная_3

.docx
Скачиваний:
3
Добавлен:
02.02.2023
Размер:
149.64 Кб
Скачать

Санкт-Петербургский государственный

электротехнический университет «ЛЭТИ» им. В.И. Ульянова (Ленина) (СПбГЭТУ)

Факультет компьютерных технологий и информатики

Кафедра ВТ

Отчет по теме №3

Деревья

Выполнил: студент гр. 8091 Гришин И.Д. ___________

Проверил: старший преподаватель Колинько П.Г. ___________

Санкт-Петербург

2020

Содержание

  1. Техническое задание 3

2. Формализация задания 3

3. Контрольные тесты 4

4. Временная сложность 5

5. Результаты измерения времени 5

Выводы 6 Список используемой литературы 7

Приложение 1 8

Приложение 2 10

Приложение 3 12

Приложение 4 14

  1. Цель работы

Написать и отладить программу для работы с деревьями по предложенному преподавателем варианту индивидуального задания. Программа должна выводить на экран изображение дерева с разметкой его вершин, сделанной заданным способом, а под ним – последовательность меток вершин при обходе дерева и результат вычисления заданного параметра. Можно взять за основу учебный пример.

  1. Задание

Вид дерева: двоичное

Разметка: обратная

Способ обхода: в ширину

Количество левых листьев

3. Обоснование деревьев

Деревья в памяти ЭВМ представлены в виде разветвляющегося списка так как структура, которая получается, напоминает дерево в реальной жизни, а также при поиске данных в таком дереве это займет у нас минимальное количество времени. Списки удобно использовать из-за простоты использования, а также из-за того, что нам не нужно знать размер дерева изначально, то есть можем динамически создавать новые узлы и деревья.

4.Контрольные тесты

Рис 1. Проведение тестов в программе «Дееревья»

5. Временная сложность

Функция

Ожидаемая

Создание

O(n)

Обход

O(n)

Вывод

O(n)

6. Выводы

Представление данных в виде деревьев очень удобно, когда мы реализуем хранение большого количества данных и нам нужно быстрое получение некоторых из них. Так как обойти дерево можно за n шагов, где n – количество вершин, то мы считаем, что использование деревьев увеличит эффективность работы многих программ, работающих с данными.

7. Список используемой литературы

1. Колинько П. Г. Алгоритмы и структуры данных. Часть 1: Пособие к самостоятельной работе и курсовому проектированию. Вып. 2003 (для заочников). –– СПб., 2020. — Error: Reference source not found с.

8. Приложение

#include <iostream> #include <stack> #include <ctime> #include <cstdlib> using namespace std; // Класс «узел дерева» class Node { char id{}; //тег узла Node *left; // левый сын Node *right; // правый сын public: Node() : left(nullptr), right(nullptr) {} // конструктор узла ~Node() { if (left) delete left; // деструктор (уничтожает поддерево) if (right) delete right; } friend class Tree; // дружественный класс «дерево» }; // Класс «дерево в целом» class Tree { Node *root; // указатель на корень дерева char num, maxnum; //счётчик тегов и максимальный тег int maxDepth, offset; //максимальная глубина, смещение корня char **screen; // память для выдачи на экран void clearScreen(); // очистка рабочей памяти Node *makeNode(int depth); // создание поддерева void outNodes(Node *v, int r, int c); // выдача поддерева Tree(const Tree &); // фиктивный конструктор копии Tree(Tree &&); //копия с переносом (С++11) Tree operator=(const Tree &) const = delete; // присваивание Tree operator=(Tree &&) const = delete; //то же, с переносом public: Tree(char nm, char mnm, int mxr); ~Tree(); void MakeTree() { root = makeNode(0); } // ввод — генерация дерева bool exist() { return root != nullptr; } // проверка «дерево не пусто» int DFS(); // обход дерева «в глубину» void outTree(); // выдача на экран }; Tree::Tree(char nm, char mnm, int mxr) : num(nm), maxnum(mnm), maxDepth(mxr), offset(40), root(nullptr), screen(new char *[maxDepth]) { for (int i = 0; i < maxDepth; i++) screen[i] = new char[80]; } Tree::~Tree() { for (int i = 0; i < maxDepth; i++) delete[]screen[i]; delete[]screen; delete root; } Node *Tree::makeNode(int depth) { Node *v = nullptr; int Y = (depth < rand() % 6 + 1) && (num <= 'z'); if (Y) { // создание узла, если Y = 1 v = new Node; v->left = makeNode(depth + 1); v->right = makeNode(depth + 1); v->id = num++; } return v; } void Tree::outTree() { clearScreen(); outNodes(root, 1, offset); for (int i = 0; i < maxDepth; i++) { screen[i][79] = 0; cout << '\n' << screen[i]; } cout << '\n'; } void Tree::clearScreen() { for (int i = 0; i < maxDepth; i++) memset(screen[i], '.', 80); } void Tree::outNodes(Node *v, int r, int c) { if (r && c && (c < 80)) screen[r - 1][c - 1] = v->id; // вывод метки if (r < maxDepth) { if (v->left) outNodes(v->left, r + 1, c - (offset >> r)); //левый сын if (v->right) outNodes(v->right, r + 1, c + (offset >> r)); //правый сын } } template<class Item> class STACK { Item *S; int t; public: explicit STACK(int maxt) : S(new Item[maxt]), t(0) {} int empty() const { return t == 0; } void push(Item item) { S[t++] = item; } Item pop() { return (t ? S[--t] : 0); } }; int Tree::DFS() { const int MaxS = 20; // максимальный размер стека int count = 0; STACK<Node *> S(MaxS); // создание стека указателей на узлы S.push(root); Node *prev = nullptr; while (!S.empty()) { Node *v = S.pop(); if (prev != nullptr && prev->left == v && v->left == nullptr && v->right == nullptr) { cout << &v->id << ' '; count++; } prev = v; if (v->right != nullptr) { // STACK <- (правый сын) S.push(v->right); } if (v->left != nullptr) { // STACK <- (левый сын) S.push(v->left); } } return count; } int main() { int n; Tree tree('a', 'z', 8); srand(static_cast<unsigned int>(time(nullptr))); tree.MakeTree(); if (tree.exist()) { tree.outTree(); cout << endl << "Обход в глубину: "; n = tree.DFS(); cout << endl << "Кол-во левых листьев = " << n; } else cout << "Дерево пусто!"; cout << '\n' << "=== Конец ==="; cin.get(); }

7

Соседние файлы в предмете Алгоритмы и структуры данных