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

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

Большинство функций Положения класса просто включает доступ к соответствующему

члены структуры Узла. Мы также включали декларацию класса PositionList как список STL положений. Это используется, чтобы представлять коллекции узлов. Чтобы сохранять кодекс простым, мы опустили проверку на ошибки, и, вместо того, чтобы использовать шаблоны, мы просто предоставляем определение типа для основного типа элемента, названного Элементом (См. Упражнение P-7.2.)

Мы представляем главную часть класса LinkedBinaryTree в Кодовом Фрагменте 7.19. Декларация класса начинается, вставляя вышеупомянутые декларации Узла и По - sition. Это сопровождается декларацией общественных участников, местная полезность func-tions и данные члена парламента, не занимающего официального поста. Мы опустили вспомогательные функции, такие как печь для сжигания отходов производства, оператор назначения, и копируем конструктора.

Элемент интервала typedef;

класс LinkedBinaryTree

защищенный:

//вставьте декларацию Узла здесь... общественность:

//вставьте декларацию Положения здесь... общественность:

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

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

//конструктор / / ошеломляет er o f никакой des//, действительно ли дерево пусто?//получают корень / / l i s t o f, никакие des//не добавляют, что корень к пустому дереву//расширяет внешний узел

Положение removeAboveExternal (константа Position& p);//удаляют p и родителя//вспомогательные опущенные функции...

защищенный: //местные утилиты

недействительный предварительный заказ (Узел* v, PositionList& мн) константа;//предварительно заказывают частную полезность:

Узел* корень; //указатель на интервал корня n; //ошеломляют er o f никакой des

;

Кодовый Фрагмент 7.19: Внедрение класса LinkedBinaryTree.

Частные данные для класса LinkedBinaryTree состоят из корня указателя к узлу корня и переменной n, содержа число узлов в дереве. (Мы добавили подчеркивание к корню имени, чтобы избежать имени conflict с членским корнем функции.) В дополнение к функциям ADT, мы ввели несколько функций обновления, addRoot, expandExternal, и removeAboveExternal, которые обеспечивают средства построить и изменить деревья. Они обсуждены ниже. Мы определяем сервисный предварительный заказ функции, который используется во внедрении положений функции.

В Кодовом Фрагменте 7.20, мы представляем определения конструктора и sim -

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

членские функции pler класса LinkedBinaryTree. Функция addRoot предполагает, что дерево пусто, и это создает единственный узел корня. (Это не должно быть призвано, если дерево непусто, так как иначе утечка памяти заканчивается.)

LinkedBinaryTree:: LinkedBinaryTree ()

: корень (ПУСТОЙ УКАЗАТЕЛЬ), n (0)

международный LinkedBinaryTree:: размер () константа

возвращают n;

bool LinkedBinaryTree:: пустой () константа

возвращают размер () == 0;

LinkedBinaryTree:: положение LinkedBinaryTree:: корень ()

возвращают Положение (корень);

недействительный LinkedBinaryTree:: addRoot ()

коренятся = новый Узел; n = 1;

//конструктор

/ / ошеломляют er o f никакой des

//действительно ли дерево пусто?

константа//получает корень

//добавьте корень к пустому дереву

Кодовый Фрагмент 7.20: Простой участник функционирует для класса LinkedBinaryTree.

Функции обновления двоичного дерева

В дополнение к функциям интерфейса BinaryTree и addRoot, класс LinkedBi-naryTree также включает следующие функции обновления, данные положение p. Первое используется для добавления узлов к дереву, и второе используется для удаления узлов.

expandExternal (p): Преобразуйте p от внешнего узла во внутренний узел

создавая два новых внешних узла и делая их левыми и правыми детьми p, соответственно; ошибка condi-tion происходит, если p - внутренний узел.

removeAboveExternal (p): Удалите внешний узел p вместе с его родительским q,

замена q с родным братом p (см. рисунок 7.15, где узел p - w и узел q, является v); состояние ошибки происходит, если p - внутренний узел, или p - корень.

(a) (b) (c)

Рисунок 7.15: Операция removeAboveExternal (p), который удаляет внешний узел w, к которому p относится и его родительский узел v.