- •1 Языки программирования. Язык Pascal. Описание синтаксиса языка программирования.
- •2 Лексическая структура языка Pascal. Структура Pascal-программы. Составной оператор. Константы. Переменные
- •3 Концепция переменной языка Pascal
- •4 Концепция типа данных языка Pascal
- •5 Простые типы языка Pascal
- •6 Стандартные типы языка Pascal
- •7 Операторы языка Pascal
- •8 Составные типы языка Pascal
- •9 Множества (определение, примеры, операции). Представление множеств, примеры использования
- •10 Файловый тип. Операции с файлами.
- •11 Процедуры и функции. Описание процедуры. Оператор процедуры
- •12 Параметры процедур и функций.
- •13 Процедурный тип. Передача процедур и функций в качестве параметра.
- •14 Директивы, используемые при описании процедур и функций.
- •15 Необходимость и преимущества модульного программирования. Структура модуля в языке Pascal.
- •16 Рекурсия. Рекурсия и итерация.
- •17 Линейный поиск. Поиск делением пополам (двоичный поиск).
- •18 Простые алгоритмы сортировки.
- •19 Усовершенствованные алгоритмы сортировки. Сортировка Шелла. Сортировка Шелла
- •20 Ссылочные типы. Динамические структуры данных
- •21 Связанные списки, операции над списками.
- •22 Двусвязные кольца.
- •23 Двоичные деревья поиска
23 Двоичные деревья поиска
Дерево — это совокупность элементов, называемых узлами (при этом один из них определен как корень), и отношений (родительский–дочерний), образующих иерархическую структуру узлов. Узлы, которые не имеют ни одного последующего узла, называются листьями.
В двоичном (бинарном) дереве каждый узел может быть связан не более чем двумя дочерними узлами. Рекурсивно двоичное дерево определяется так:
двоичное дерево бывает либо пустым (не содержит ни одного узла),
либо содержит узел, называемый корнем, а также два независимых поддерева — левое и правое.
Двоичное дерево поиска может быть либо пустым, либо оно обладает таким свойством, что корневой элемент имеет большее значение узла, чем любой элемент в левом поддереве, и меньшее или равное, чем элементы в правом поддереве. Указанное свойство называется характеристическим свойством двоичного дерева поиска и выполняется для любого узла такого дерева, включая корень. Свое название двоичные деревья поиска получили по той причине, что скорость поиска в них примерно такая же, что и в отсортированных массивах: log2n.
Пример. Для набора данных 9, 44, 0, –7, 10, 6, –12, 45 построим двоичное дерево поиска. Согласно определению двоичного дерева поиска число 9 помещаем в корень, все значения, меньшие его — на левое поддерево, большие или равные — на правое. В каждом поддереве очередной элемент можно рассматривать как корень и действовать по тому же алгоритму. В итоге получаем
Выделим типовые операции над двоичными деревьями поиска:
добавление элемента в дерево;
удаление элемента из дерева;
обход дерева (для печати элементов и т.д.);
поиск в дереве.
Поскольку определение двоичного дерева рекурсивно, то все указанные типовые операции могут быть реализованы в виде рекурсивных подпрограмм (на практике именно такой вариант чаще всего и применяется).
