
- •3. Деревья
- •3.1. Основные определения
- •Пример 2.В качестве примера древовидной структуры можно рассматривать арифметические выражения. Правила соответствия имен узлов элементам выражений следующие:
- •3.2. Обходы бинарных деревьев
- •Пример 3. Рассмотрим 3 вида обхода на примере дерева, изображенного на рис.3.3.
- •Пример 4.Рассмотрим 3 вида обхода для дерева на рисунке 3.2
- •3.3. Операции с деревьями бинарного поиска
- •Пример 5. Если мы будем вводить с клавиатуры узлы 10, 7, 25, 31, 18, 6, 3, 12, 22, 8, то получим дерево, представленное на рис. 3.3.
- •Поиск по дереву
- •Удаление узла из дерева
- •Удаление дерева
- •Замечания
- •3.4. Операции с идеально сбалансированными деревьями
- •Поиск по дереву
- •Удаление дерева
- •3.3. Решение практических задач с использованием деревьев
3. Деревья
3.1. Основные определения
Деревья представляют собой иерархическую структуру некой совокупности элементов. Примером деревьев могут служить генеалогические деревья и организационные диаграммы. Деревья используются при анализе электрических цепей, при представлении структур математических формул. Они также естественным путем возникают во многих областях компьютерных наук. Например, деревья используются для организации информации в системах управления базами данных и для представления синтаксических структур в компиляторах программ.
Будем определять дерево как конечное множество Т, состоящее из одного или более узлов, таких, что:
имеется один специально обозначенный узел, называемый корнем данного дерева;
остальные узлы (исключая корень) содержатся в
попарно не пересекающихся множествах
, каждое из которых в свою очередь является деревом. Деревья называются поддеревьями данного корня.
Это определение является рекурсивным, т.е. мы определили дерево в терминах самих же деревьев.
Из
данного определения следует, что каждый
узел дерева является корнем некоторого
поддерева, которое содержится в этом
дереве. Число поддеревьев данного узла
называется степенью
этого узла. Узел с нулевой степенью
называется листом.
Уровень узла
по отношению к дереву Т
определяется следующим образом: говорят,
что корень имеет уровень 1, а другие узлы
имеют на единицу выше их уровня
относительно содержащего их поддерева
этого корня.
Каждый корень является отцом (родителем) корней своих поддеревьев; последние являются сыновьями (детьми) своего отца. Каждый узел (кроме корня) имеет одного родителя и произвольное число сыновей. Корень не имеет родителя, листы не имеют сыновей.
Пример. Рассмотрим дерево, представленное на рис. 3.1. Оно имеет корень A и 5 листьев: H, J, D, G, F. Степени вершин этого дерева следующие: A, В имеют степень 2, С – 3, Е – 1. Корень А располагается на 1 уровне, узлы В, С – на втором, H, J, D, E, F – на третьем, G – на четвертом.
Путем
из узла
в узел
называется последовательность узлов
,
где
,
узел
является родителем узла
.
Если существует путь из узла
в узел
,
то
называется предком
,
- потомком
.
Длиной
пути называется число на 1 меньше числа
узлов, составляющих этот путь.
Рис. 3.1. Пример дерева
Высотой узла дерева называется длина самого длинного пути из этого узла до какого-либо листа. Высота дерева совпадает с высотой корня. Например, для дерева, изображенного на рис. 3.1, высота узла H равна 0, высота узла В – 1, узла С – 2, высота дерева – 3.
Глубина узла определяется как длина пути от корня до этого узла. Например, для дерева, изображенного на рис. 3.1, глубина узла H равна 2, глубина узла В – 1, узла G – 3.
Пример 2.В качестве примера древовидной структуры можно рассматривать арифметические выражения. Правила соответствия имен узлов элементам выражений следующие:
каждый лист соответствует операнду и содержит его значение;
каждый внутренний (родительский узел) соответствует оператору.
Предположим,
что данный узел соответствует бинарному
оператору
,
левый сын этого узла соответствует
выражению
,
правый – выражению
.
Тогда данный узел и его сыновья
представляют выражение (
)
(
).
Рассмотрим вышесказанное на примере следующего арифметического выражения: a-b(c/d+e/f). Данному арифметическому выражению будет соответствовать дерево на рис. 3.2.
Рис. 3.2. Древовидная структура математического выражения
Упорядоченное дерево – это дерево, в котором для каждого узла множество его детей упорядоченно. Сыновья отца обычно упорядочиваются слева направо.
Бинарное дерево – это дерево, в котором каждый узел имеет не более двух поддеревьев. В этом случае будем различать левое и правое поддерево.
Дерево двоичного поиска – это бинарное дерево, узлы которого помечены элементами множества. Определяющее свойство дерева двоичного поиска заключается в том, что все элементы, хранящиеся в узлах левого поддерева любого узла х, меньше элемента, содержащегося в узле х, а все элементы, хранящиеся в узлах правого поддерева узла х, больше элемента, содержащегося в узле х. Это свойство называется характеристическим свойством дерева двоичного поиска и выполняется для любого узла дерева двоичного поиска, включая его корень.
Идеально сбалансированное дерево – это дерево минимальной высоты из элементов некоторого множества, для каждого узла которого будет выполняться условие: модуль разности количеств узлов в любых двух его поддеревьев не превышает единицы. Другими словами дерево называется идеально сбалансированным, если все его уровни, за исключением, может быть, последнего, полностью заполнены.
Например, бинарное дерево, изображенное на рис. 3.3, является деревом бинарного поиска в соответствии с ранее данным определением. Однако условие идеального сбалансирования для этого дерева не выполняется: для узла со значением 25 количество узлов в левом поддереве равно 3, а в правом поддереве – 1. Дерево, изображенное на рис. 3.4, является деревом бинарного поиска и идеально сбалансированным деревом одновременно.
Далее мы будем рассматривать только бинарные деревья.
На C++ бинарное дерево можно представить следующим образом:
struct tree
{
int inf;
tree *left, *right;
};
tree *root;
В таком представлении дерево определяется указателем на свой корень. Каждый узел содержит информационную часть (inf) и указатели на узлы, которые являются его левым (left) и правым (right) сыном.