5. Бинарные деревья
Связный граф без циклов называется деревом. Дерево – это сложная динамическая структура данных, применяющаяся для эффективного хранения информации.
Упорядоченное дерево – это дерево, у которого ребра (ветви), исходящие из каждой вершины, упорядочены.
Корневое дерево – дерево, в котором одна вершина выделена и называется корнем.
Двоичное (бинарное) корневое дерево – это дерево, в котором из каждой вершины исходит не более двух ребер (рис. 5.1). Иногда бинарное дерево (БД) определяют рекурсивно: БД – это конечное множество узлов (вершин), которое либо пусто, либо состоит из корня (вершины) с двумя отдельными БД, которые называются левым и правым поддеревом этого корня. Далее будем иметь дело только с БД, поэтому если мы говорим дерево, то это означает БД.
Вершина y, находящаяся непосредственно ниже вершины x, называется непосредственным потомком x, а вершина x называется предком y.
Если вершина не имеет потомков, то она называется терминальной вершиной или листом, если имеет, то называется внутренней вершиной.
У
ровень–характеризует
расстояние до корня. Считается, что
корень дерева находится на уровне 0.
Максимальный
уровень
какой-либо из вершин дерева называется
его глубиной
или высотой.
Применение. Организация данных с помощью бинарных деревьев часто позволяет значительно сократить время поиска нужного элемента. Поиск элемента в линейных структурах данных обычно осуществляется путем последовательного перебора всех элементов, присутствующих в данной структуре. Поиск по дереву не требует перебора всех элементов, поэтому занимает значительно меньше времени. Максимальное число шагов при поиске по дереву равно высоте данного дерева, т.е. количеству уровней в иерархической структуре дерева.
Представление деревьев. Наиболее часто используются следующие представления деревьев.
1. Списочная структура.
2. Упакованный массив.
3. Польская запись.
Рассмотрим представление дерева в виде списочной структуры. Деревья относятся к разряду структур, которые удобно строить в динамической памяти с использованием указателей. Вершина дерева будет описана следующим образом:
Tyрe u = ^uzl;
uzl = Record {запись – вершина }
i :Tinf; { поле информации }
L, R :u; { указатели на правое и левое поддеревья}
End;
Var h :u; { указатель на корень дерева}
Ссылки на пустые деревья будут обозначаться значением Nil. Тогда БД можно построить с помощью следующей рекурсивной процедуры:
Procedure TCreate (Var t:u );
Begin
Inc(k);
If s[k]<>'.'
Then Begin
New(t); t^.i:=s[k];
TCreate (t^.L); TCreate (t^.R);
End
Else t := Nil;
End;
{ Головная программа }
Begin
s := 'ABD...CE.G..FH..J..'; {описание дерева на рис.5.1 - входной поток }
k:=0;
T1(h);
……
End;
Структура дерева отражается во входном потоке данных: каждой вводимой пустой связи соответствует условный символ (в данном случае точка).
