- •Ю.Е. Алексеев, а.В. Куров
- •Часть 4
- •Алексеев Юрий Евтихович Куров Андрей Владимирович
- •8. Символьный тип данных
- •8.1 Общие сведения и библиотечные функции
- •8.2 Примеры программ обработки символьных данных
- •8.3 Задания на обработку символьных матриц
- •9. Строки
- •9.1 Общие сведения и библиотечные функции
- •9.2 Примеры программ обработки строк (массивова символов)
- •9.3 Задания на обработку строк
- •10. Типы данных структура и объединение
- •10.1 Общие сведения о структурах
- •10.2 Примеры программ обработки структур
- •10.3 Задания на обработку структур
- •10.4 Объединения
- •10.5 Примеры программ обработки объединений
- •11. Файлы
- •11.1 Основные сведения о файлах
- •11.2 Библиотечные функции для работы с файлами
- •11.3 Примеры программ обработки текстовых файлов
- •11.4 Задания на обработку текстовых файлов.
- •11.5 Примеры программ обработки бинарных файлов
- •11.6 Задания на бинарные файлы.
- •12. Тип данных указатель
- •12.1 Общие сведения Объявления и присваивания
- •Операции с указателями
- •Приоритеты операций при работе с указателями.
- •Взаимосвязь массивов и указателей
- •12.2 Динамические переменные и массивы Динамические переменные
- •Динамические массивы
- •Двумерные динамические массивы
- •Доступ к элементам динамической матрицы
- •Библиотечные функции с для работы с динамическими переменными и массивами
- •Передача в функции динамических массивов
- •13 Динамические структуры данных
- •13.1 Списки Линейный список
- •Пример программы работы с однонаправленным списком
- •Пример программы работы с двунаправленным списком
- •13.2 Задания на обработку списков.
- •13.3 Деревья бинарные
- •Структура бинарного дерева
- •Примеры работ с бинарным деревом
- •Список литературы
- •Алфавитный указатель
- •Вопросы для самопроверки Символы
- •Структуры
- •Указатели
13.3 Деревья бинарные
Термин "дерево" был введён в теории графов [8]. Не вдаваясь в математические определения, рассмотрим пример представления дерева в виде рисунка (рис. 1), в чем состоит назначение его частей и какие термины принято использовать.
Рис. 1.
Как и любой граф, дерево состоит из узлов (вершин), соединённых линиями. Если узлы находятся в отношении следования \ предшествования, то линии имеют стрелки (как на рис. 1) и называются дугами, иначе - рёбрами. Узлы могут содержать метки, в качестве которых могут выступать или тексты, или числа, или что-либо другое, или их комбинации.
В дереве всегда есть только один узел, у которого нет предшествующих узлов, называемый корнем дерева (на рисунке это узел с числом 70). Узлы, за которыми не следуют другие, называют терминальными узлами или листьями (на рисунке это узлы с числами 55, 65, 90).
Деревья издавна использовались для наглядного представления различных видов данных с иерархической структурой: генеалогии родóв, властных структур, классификаций объектов природы и проч. Из объектов, имеющих отношение к информатике, древовидную структуру имеют файловые структуры запоминающих устройства и классы в ряде объектно-ориентированных систем программирования. Множество примеров алгоритмов обработки данных, размещаемых в древовидных структурах, представлены в [9] и других публикациях.
При разработке компьютерных программ деревья, как и списки, реализуются с помощью переменных типа структура и объектов классов, содержащих поля-указатели. Сами эти переменные соответствуют узлам дерева, а поля-указатели реализуют связи между узлами.
Структура бинарного дерева
Наиболее простым по организации и использованию в программе являются бинарные деревья. Их элементы, соответствующие узлам дерева-графа, имеют только два поля-указателя для связи с другими элементами. Если иметь в виду наглядное представление дерева в программе, элементы которого имеют тип
struct telement
{
int inf;
telement *L, *R;
};
и изображаются в виде таблиц
то оно будет иметь вид рис. 2.
Рис. 2.
Все работы с деревом в программе
начинаются с корневого элемента, поэтому
в ней должна быть хотя бы одна переменная,
содержащая его адрес. На рис. 2 такую
переменную, которая должна иметь тип
telement, представляет элемент с именем PK.
Листьями дерева, представленного на
рис. 2, являются элементы с числами 55, 65
и 90. У соответствующих переменных оба
поля указателей должны иметь значение
NULL, что на рисунке обозначено значком
.
Если в дереве отношения следования узлов задают дуги, то для размещения информации в узлах необходимо использовать некие дополнительные условия. Например, в корне каждого поддерева должно быть число, большее чисел во всех остальных его элементов. Другой пример: в каждом поддереве должно быть число такое, что все элемент его поддерева по левой ветви должны иметь меньшие числа, а в правом поддереве - большие (именно так размещены числа в дереве рис. 2 и именно такой способ размещения данных на дереве будет использован в рассматриваемых далее примерах, а дерево будем называть упорядоченным). При этом следует иметь в виду, что программа должна строить дерево последовательным добавлением элементов.
Изначально дерево должно быть пустым, то есть переменная PK должна иметь значение NULL. Далее очередной элемент будет добавляться как новый лист к узлу, найденному при движении от корня дерева по алгоритму: если добавляемое в дерево число меньше числа очередного узла, то делается переход к следующему узлу - корню левого поддерева, иначе - к корню правого поддерева (считаем, что все числа в создаваемом дереве разные), а если соответствующего поддерева нет, то по этой ветке и добавляется новый узел с заданным числом. Например, если в дерево на рис. 2 нужно добавить число 75, то новый узел будет размещен по левой ветке узла с числом 80. А если добавить число 67, то новый узел будет размещен по правой ветке узла с числом 65.
