Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

7.3. Двоичные деревья 287

Затем, в Кодовом Фрагменте 7.16, мы представляем неофициальный интерфейс C ++ для набора из двух предметов

дерево. Чтобы сохранять интерфейс максимально простым, мы проигнорировали ошибочную обработку, и следовательно мы не объявляем, что любые исключения брошены.

шаблон <typename E> класс BinaryTree <E> 

общественность:

Положение класса; класс PositionList;

общественность:

международный размер () константа; пустой bool () константа; корень Положения () константа; положения PositionList () константа;

;

//

// // // // // // // // //

основной тип элемента

общественные типы двоичного дерева узел помещает список членских функций положений оцепенелый er o f никакой des дерево, пусты? получите корень l i s t o f никакой des

Кодовый Фрагмент 7.16: неофициальный интерфейс для двоичного дерева ADT (не полное

C ++ класс).

Хотя мы формально не определили интерфейс для класса PositionList, мы можем предположить, что это удовлетворяет стандартный список ADT, как дали в Главе 6. В наших кодовых примерах мы предполагаем, что PositionList осуществлен как список STL объектов Положения типа.

7.3.3 Свойства двоичных деревьев

У двоичных деревьев есть несколько интересных свойств, имеющих дело с отношениями между

их высоты и число узлов. Мы обозначаем набор всех узлов дерева T, на той же самой глубине d, как уровень d T. В двоичном дереве у уровня 0 есть один узел (корень), у уровня 1 есть, самое большее, два узла (дети корня), у уровня 2 есть, самое большее, четыре узла, и так далее. (См. рисунок 7.12.) В целом у уровня d есть, самое большее, 2-е узлы.

Мы видим, что максимальное количество узлов на уровнях двоичного дерева растет по экспоненте, поскольку мы спускаемся по дереву. От этого простого наблюдения мы можем получить следующие свойства, связывающие высоту набора из двух предметов T к его числу узлов. Подробное оправдание этих свойств оставляют как упражнение (R-7.16).

Суждение 7.10: Позвольте T быть непустым двоичным деревом и позволить n, nE, nI, и h обозначают

число узлов, число внешних узлов, число внутренних узлов и высота T, соответственно. Тогда у T есть следующие свойства:

1. h +1£ n2£ h+1 - 1

2. 1£ nEh 3 за 2£. h£ nI2£ h- 1 4. регистрация (n + 1)-1£ h£ n- 1

Кроме того, если T надлежащий, то у него есть следующие свойства:

288 Глава 7. Деревья

1. 2 ч +1£ n2£ h+1 - 1

2. h +1£ nEh 3 за 2£. h£ nI2£ h- 1 4. регистрация (n + 1)-1£ h£ (n- 1)/2

Рисунок 7.12: Максимальное количество узлов на уровнях двоичного дерева.

В дополнение к свойствам двоичного дерева выше, у нас также есть следующий пере - lationship между числом внутренних узлов и внешними узлами в надлежащем двоичном дереве. Суждение 7.11: В непустом надлежащем двоичном дереве T, число внешних узлов - еще один, чем число внутренних узлов.

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

Если с другой стороны мы имеем два или больше, то у корня есть два поддерева. Так как поддеревья меньше, чем оригинальное дерево, мы можем предположить, что они удовлетворяют суждение. Таким образом у каждого поддерева есть еще один внешний узел, чем внутренние узлы. Между двумя из них есть еще два внешних узла, чем внутренние узлы. Но, корень дерева - внутренний узел. Когда мы рассматриваем корень и оба поддерева вместе, различие между числом внешних и внутренних узлов

2- 1 = 1, который является, что мы хотим.

Обратите внимание на то, что вышеупомянутые отношения не держатся, в целом, для неподходящих двоичных деревьев и недвойных деревьев, хотя есть другие интересные отношения, которые могут держаться, поскольку мы исследуем в упражнении (C-7.9).