
- •Методические указания для лабораторных работ по дисциплине «Алгоритмы и структуры данных» Введение
- •Лабораторная работа № 1. Линейная структура данных «стек» и операции над ним
- •Лабораторная работа №2. Линейная структура данных «очередь» и операции над ней
- •Лабораторная работа № 3. Структура данных «список»
- •Лабораторная работа №4. Алгоритмы методов сортировки и поиска.
- •1. Пузырьковая сортировка (методом обмена).
- •2. Сортировка методом выбора
- •3. Сортировка методом вставки
- •4. Сортировка методом Шелла
- •5. Сортировка методом Хоора
- •Лабораторная работа №5. Алгоритмы поиска.
- •1. Последовательный поиск
- •2. Бинарный поиск
- •Лабораторная работа № 6. Дерево и операции с ним
- •Пример, реализующий алгоритмы сортировки и запись результатов в файл
Лабораторная работа № 6. Дерево и операции с ним
Целью работы является получение практических навыков реализации деревьев и операций над ними.
Дерево – это структура данных, представляющая собой совокупность элементов и отношений, образующих иерархическую структуру этих элементов (рисунок 8). Каждый элемент дерева называется вершиной (узлом) дерева. Вершины дерева соединены направленными дугами, которые называют ветвями дерева. Начальный узел дерева называют корнем дерева, ему соответствует нулевой уровень. Листьями дерева называют вершины, в которые входит одна ветвь и не выходит ни одной ветви.
Каждое дерево обладает следующими свойствами:
существует узел, в который не входит ни одной дуги (корень);
в каждую вершину, кроме корня, входит одна дуга.
Деревья особенно часто используют на практике при изображении различных иерархий. Например, популярны генеалогические деревья.
Рисунок 8 – Пример дерева
Все вершины, в которые входят ветви, исходящие из одной общей вершины, называются потомками, а сама вершина – предком. Для каждого предка может быть выделено несколько потомков. Уровень потомка на единицу превосходит уровень его предка. Корень дерева не имеет предка, а листья дерева не имеют потомков.
Высота (глубина) дерева определяется количеством уровней, на которых располагаются его вершины. Высота пустого дерева равна нулю, высота дерева из одного корня – единице. На первом уровне дерева может быть только одна вершина – корень дерева, на втором – потомки корня дерева, на третьем – потомки потомков корня дерева и т.д.
Поддерево – часть древообразной структуры данных, которая может быть представлена в виде отдельного дерева.
Степенью вершины в дереве называется количество дуг, которое из нее выходит. Степень дерева равна максимальной степени вершины, входящей в дерево. При этом листьями в дереве являются вершины, имеющие степень нуль. По величине степени дерева различают два типа деревьев:
двоичные – степень дерева не более двух;
сильноветвящиеся – степень дерева произвольная.
Упорядоченное дерево – это дерево, у которого ветви, исходящие из каждой вершины, упорядочены по определенному критерию.
Двоичное дерево упорядоченно, если для любой его вершины x справедливы такие свойства:
все элементы в левом поддереве меньше элемента, хранимого в x,
все элементы в правом поддереве больше элемента, хранимого в x,
все элементы дерева различны.
Деревья являются рекурсивными структурами, так как каждое поддерево также является деревом. Таким образом, дерево можно определить как рекурсивную структуру, в которой каждый элемент является:
либо пустой структурой;
либо элементом, с которым связано конечное число поддеревьев.
Действия с рекурсивными структурами удобнее всего описываются с помощью рекурсивных алгоритмов.
Списочное представление деревьев основано на элементах, соответствующих вершинам дерева. Каждый элемент имеет поле данных и два поля указателей: указатель на начало списка потомков вершины и указатель на следующий элемент в списке потомков текущего уровня. При таком способе представления дерева обязательно следует сохранять указатель на вершину, являющуюся корнем дерева.
Для того чтобы выполнить определенную операцию над всеми вершинами дерева необходимо все его вершины просмотреть. Такая задача называется обходом дерева.
Обход дерева – это упорядоченная последовательность вершин дерева, в которой каждая вершина встречается только один раз.
При обходе все вершины дерева должны посещаться в определенном порядке. Существует несколько способов обхода всех вершин дерева. Выделим три наиболее часто используемых способа обхода дерева (рисунок 9):
прямой;
симметричный;
обратный.
Рисунок 9 - Обходы деревьев
Бинарное (двоичное) дерево – это динамическая структура данных, представляющее собой дерево, в котором каждая вершина имеет не более двух потомков ( рисунок 10). Таким образом, бинарное дерево состоит из элементов, каждый из которых содержит информационное поле и не более двух ссылок на различные бинарные поддеревья. На каждый элемент дерева имеется ровно одна ссылка.
Рисунок 10 - Бинарное дерево и его организация
Каждая вершина бинарного дерева является структурой, состоящей из четырех видов полей. Содержимым этих полей будут соответственно:
информационное поле (ключ вершины);
служебное поле (их может быть несколько или ни одного);
указатель на левое поддерево;
указатель на правое поддерево.
В результате получаем структуру, описывающую вершину (предполагая, что служебные поля у каждой вершины отсутствуют):
struct Node
{int info;
Node *left;
Node *right; };
Процедура создания узла:
Node* New(int data)
{Node* V;
V=(Node*)malloc (sizeof Node);
V->info=data;
V->left=V->right=NULL;
return V;
};
Алгоритм добавления вершины
Алгоритм добавления вершины в упорядоченное бинарное дерево.
Шаг 0. Первый элемент становится корневым.
Шаг 1. Сравнить значение очередного элемента со значением в корне.
Шаг 2. Если значение меньше, то в качестве корня принять левого потомка корня, иначе правого потомка.
Перейти на Шаг 1. Шаг 3. Если потомка нет, то создать вершину и включить ее в дерево.
Алгоритм удаления вершины
На подготовительном этапе необходимо найти узел дерева, содержащий заданное значение или убедиться, что такого нет. Этот процесс имеет в среднем O(log2n) операций сравнения. Предполагаем, что вершина найдена. Рассмотрим варианты расположения вершины для удаления:
1. Лист.
2. Внутренняя вершина, имеющая одного поддерево.
3. Внутренняя вершина, имеющая оба поддерева. Сюда же входит случай удаления корня.
В случае удаления листа мы просто удаляем узел без каких-либо преобразований.
Алгоритм удаления узла с одним поддеревом представлен на рисунке 11.
Рисунок 11 – Удаление вершины с одним поддеревом
Алгоритмы удаления узла с двумя поддеревьями и корня представлены на рисунках 12 и 13.
Рисунок 12 – Удаление вершины с двумя поддеревьями
Рисунок 13 – Удаление корня
Задание на лабораторную работу
Написать функцию для построения упорядоченного бинарного дерева из множества, вводимого из клавиатуры. Число элементов множества также задается с клавиатуры.
Вывести полученное дерево с использованием различных вариантов обхода: прямой, симметричный, обратный.
Приложение 1