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

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

Функцию expandExternal (p) показывают в Кодовом Фрагменте 7.21. Разрешение v

будьте связанным узлом p, он создает два новых узла. Каждый становится покинутым ребенком v, и другой становится правильным ребенком v. Конструктор для Узла инициализирует указатели узла на ПУСТОЙ УКАЗАТЕЛЬ, таким образом, мы должны только обновить родительские связи нового узла.

//расширьте внешний узел

недействительный LinkedBinaryTree:: expandExternal (константа Position& p)

Узел* v = p.v;

v-> уехал = новый Узел;

v-> ëåâî-> паритет = v; v-> право = новый Узел; v-> право-> паритет = v;

n + = 2;

//узел p//добавляет, что новый покинутый ребенок//v является его родителем//, и новый правильный ребенок//v - свой родитель//еще два узла

Кодовый Фрагмент 7.21: функция expandExternal (p) класса LinkedBinaryTree.

Функцию removeAboveExternal (p) показывают в Кодовом Фрагменте 7.22. Позвольте w быть связанным узлом p и позволить v быть своим родителем. Мы предполагаем, что w внешний и не является корнем. Есть два случая. Если w - ребенок корня, удаляя w, и его родитель (корень) заставляет родного брата w становиться новым корнем дерева. В противном случае мы заменяем родителя w родным братом w. Это вовлекает прародителя w's открытия и определение, является ли v левым или правым ребенком прародителя. В зависимости от которого, мы устанавливаем связь для соответствующего ребенка прародителя. После расцепления w и v, мы удаляем эти узлы. Наконец, мы обновляем число узлов в дереве.

LinkedBinaryTree:: Положение //удаляют p и родителя

LinkedBinaryTree:: removeAboveExternal (константа Position& p)

Узел* w = p.v; Узел* v = w-> паритет; //получают узел и родителя p

Узел* родство = (w == v-> уехал? v-> право: v-> оставленный);

если (v == корень)

укоренитесь = родство;

родство-> паритет = ПУСТОЙ УКАЗАТЕЛЬ;

еще

Узел* gpar = v-> паритет; если (v == gpar-> оставленный) gpar-> оставленный = родство; еще gpar-> право = родство; родство-> паритет = gpar;

удалите w; удалите v;

n - = 2;

возвратите Положение (родство);

//ребенок корня?//.. корень родного брата .make

//прародитель w//заменяет родителя родством

//удалите удаленные узлы//два меньше узлов

Кодовый Фрагмент 7.22: внедрение функции removeAboveExternal (p).

294

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

Положения функции показывают в Кодовом Фрагменте 7.23. Это призывает сервисный предварительный заказ функции, который пересекает дерево и хранит положения узла в векторе STL.

/ / l i s t o f al l никакой des LinkedBinaryTree:: PositionList LinkedBinaryTree:: положения () константа

Мн PositionList;

предварительный заказ (корень, мн); //предварительно приказывают, чтобы пересечение возвратило (мн) PositionList; //возвращение, заканчивающееся список

//пересечение перед заказом

недействительный LinkedBinaryTree:: предварительный заказ (Узел* v, PositionList& мн) константа

pl.push назад (Положение (v)); //добавляют этот узел

если (v-> оставленный! = ПУСТОЙ УКАЗАТЕЛЬ) //пересекают оставленное поддерево

предварительный заказ (v-> уехал, мн);

если (v-> право! = ПУСТОЙ УКАЗАТЕЛЬ) //пересекают правильное поддерево

предварительный заказ (v-> право, мн);

Кодовый Фрагмент 7.23: внедрение положений функции.

Мы опустили вспомогательные функции (печь для сжигания отходов производства, скопируйте конструктора и оператора назначения). Мы оставляем их как упражнения (Упражнение C-7.22), но они также включают выполнение пересечения дерева.

Выполнение внедрения LinkedBinaryTree

Давайте теперь проанализируем продолжительность функций класса LinkedBinaryTree,

который использует связанное представление структуры.

• Каждая из функций положения уехала, право, родитель, isRoot, и isExternal берет

O (1) время.

• Получая доступ к членской переменной n, который хранит число узлов T,

размер функций и пустой каждый пробег в O (1) время.

• accessor функционируют пробеги корня в O (1) время.

• Функции обновления expandExternal и removeAboveExternal посещают только

постоянное число узлов, таким образом, они оба пробег в O (1) время.

• Положения функции осуществлены, выполнив пересечение перед заказом, который

берет O (n) время. (Мы обсуждаем три различных пересечения двоичного дерева в Секунду -

tion 7.3.6. Любой из них достаточен.) Узлы, которые посещает пересечение, каждый добавлены в O (1) время к списку STL. Таким образом, положения функции берет O (n) время.

Таблица 7.2 суммирует выполнение этого внедрения двоичного дерева. Есть объект Узла класса (Кодовый Фрагмент 7.17) для каждого узла дерева T. Таким образом полное космическое требование - O (n).