Двоичное дерево

Двоичное дерево – вид связного ациклического (не имеющего циклов) графа, характерный тем, что у каждого из его узлов имеется не более двух потомков (связанных узлов, находящихся иерархически ниже).

Определения следующего абзаца не относятся непосредственно к двоичным деревьям, а скорее к деревьям вообще, поэтому тем, у кого не возникает проблем с понятиями можно перейти к следующему абзацу.

В двоичном дереве есть только один узел, у которого нет предка, он называется корнем. Конечные узлы – листья. Если у корня отсутствует предок, то у листьев – потомки. Все вершины помимо корня и листьев называются узлами ветвления. Длина пути от корня до узла определяет уровень этого самого узла. Уровень корня дерева всегда равен нулю, а уровень всех его потомков определяется удаленностью от него. Например, узлы F и L (рис. 4.2) расположены на первом уровне, а U и B – на третьем.

 

Рисунок 4.2 – Двоичное дерево

 

Связанный граф является деревом тогда и только тогда, когда P-A=1, где P – количество вершин в графе, а A – количество ребер, поскольку в любом дереве с n вершинами, должно быть n-1 ребро. Это справедливо и для бинарного дерева, так как оно входит в класс деревьев. А увидеть отличительные признаки бинарного дерева, можно просто зная его определение. Достаточно взглянуть на рисунок 1, чтобы понять является ли изображенный на нем граф бинарным деревом. Во-первых, он связный и не имеет ни одного цикла (следовательно, имеем дело с деревом), во-вторых из каждого узла исходит не больше двух ребер (если бы граф был неориентированным, то допускалось три исходящих ребра), что указывает на главный признак двоичного дерева. Но усмотреть в дереве бинарное дерево, можно и немного иным способом, который все же основываются на указанных свойствах. Наше дерево имеет 3 уровня (0, 1, 2, 3), и если выписать количество вершин находящихся на каждом из них, то получиться такой список:

 

Уровень Количество вершин

 

Если обозначить уровень символом k, а количество вершин n, то для бинарного дерева будет справедливо равенство n≤2k, т. е. количество вершин на k-ом уровне не может иметь значение большее, чем степень двойки этого уровня. Для доказательства этого достаточно построить полное дерево (рис. 4.3), все уровни которого содержат максимально возможное для двоичного дерева количество вершин.

 

Рисунок 4.3 – Полное двоичное дерево

 

Продолжая построение, будем получать на каждом новом уровне число вершин равное k-ой степени двойки, а их общее количество вычисляется по формуле:

Для рисунка 2 формула раскрывается так: 20+21+22+23=15.

Операция, при которой вершины дерева поочередно просматриваются и каждая только один раз, называется обходом дерева. Выделяют четыре основных метода обхода:

· обход в ширину;

· прямой обход;

· обратный обход;

· симметричный обход.

Обход в ширину – это поуровневая обработка узлов слева на право. Работа метода заключается в просмотре всех вершин, начиная с некоторой вершины на n-ом уровне. Пусть нулевой уровень будет стартовым, тогда, начиная с вершины K (рис. 4.3), мы методом обхода в ширину будем поочередно двигаться вниз, просматривая вершины в следующем порядке: K, A, X, T, N, H, Q, F, U, P, L, B, J, V, Y.

Обход в прямом порядке вначале предполагает обработку узлов предков, а потом их потомков, то есть сначала посещается вершина дерева, далее левое и правое поддеревья (именно в таком порядке). Последовательность прямого обхода (рис. 4.3): K, A, T, F, U, N, P, L, X, H, B, J, Q, V, Y.

Обход в обратном порядке противоположен прямому обходу. Первыми осматриваются потомки, а уже затем предки, иначе говоря, первоначально обращение идет к элементам нижних уровней левого поддерева, потом то же самое с элементами правого, и в конце осматривается корень. Порядок обратного обхода все того же дерева: F, U, T, P, L, N, A, B, J, H, V, Y, Q, X, K.

Обход в симметричном порядке заключается в посещении левого узла, перехода в корень и оттуда в правый узел. Симметричный обход: F, T, U, A, P, N, L, K, B, H, J, X, V, Q, Y.

На практике используются не просто бинарные деревья, а их частные случаи, например, такие как двоичное дерево поиска, АВЛ-дерево, двоичная куча и другие.