Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие часть1.doc
Скачиваний:
22
Добавлен:
01.03.2025
Размер:
6.94 Mб
Скачать

Вырожденные бинарные деревья

Дерево, содержащее на каждом уровне только один узел, называется вырожденным (degenerate) деревом (рис. 3.6,б). Вырожденное дерево можно считать аналогом линейного связного списка, поэтому при заданном количестве узлов n высота вырожденного дерева является максимально возможной:

h=n-1

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

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

Полные бинарные деревья

Наивысшей степенью плотности обладают полные бинарные деревья, которые имеют 2k узов на каждом уровне k (рис. 3.7).

Рис.3.7. Полное бинарное дерево высоты два

Рассмотрим некоторые свойства полных бинарных деревьев.

На первых k-1 уровнях количество узлов составляет

1 + 2 + 4 + ... + 2k-1 = 2k-1

На уровне k количество узлов 2k, т. е. ровно на один больше.

Из этого следует, что в полном бинарном дереве количество внутренних узлов на единицу меньше количества листьев, а общее число его узлов и высота связаны соотношением n=2h+1-1.

Следовательно, высота полного бинарного дерева определяется формулами:

h= log 2 (n+1)-1, где n — количество узлов полного бинарного дерева

или

h=log 2 L, где L — количество листьев (поскольку L=2h )

Приведенные формулы соответствуют минимально возможному значению высоты бинарного дерева.

Бинарные деревья минимальной высоты с произвольным числом узлов

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

Тогда 2h≤n≤2h+1-1 , следовательно, h= log 2 (n+1)-1

Здесь операция x обозначает ближайшее целое, большее или равное x, например, 2,1 =3; 2,9 =3.

Почти полные бинарные деревья

Если узлы на последнем уровне располагать по порядку, начиная слева, то полученное таким образом бинарное дерево называют почти полным. На рис. 3.8 изображено почти полное бинарное дерево.

Рис.3.8. Почти полное бинарное дерево

Полные и почти полные бинарные деревья обладают еще одним интересным свойством — если их узлы нумеровать, начиная с единицы, сверху вниз и слева направо, то левому сыну всегда будет соответствовать код, в два раза больше кода его родителя, а правому сыну — код, на единицу больший, чем код код левого сына (рис.3.8). Номер корня всегда равен 1, его левый потомок получает номер 2, правый - номер 3. Левый потомок узла 2 получит номер 4, а правый - 5, левый потомок узла 3 получит номер 6, правый - 7 и т.д.

Рис.3.8. Нумерация узлов полного или почти полного бинарного дерева

По такой схеме можно нумеровать и узлы бинарных деревьев, которые не являются почти полными, поскольку в этом случае гарантируется уникальность каждого номера, если в процессе работы к дереву добавляются новые листья. Используя такой способ нумерации, можно реализовать древовидную структуру на основе массива. Заметим, что в С/С++ нумерация элементов массива начинается с нуля, поэтому схема нумерации будет немного отличаться от приведенной на рисунке 3.8,б.