
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;
Структура дерева отражается во входном потоке данных: каждой вводимой пустой связи соответствует условный символ (в данном случае точка).