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

8.3. Кучи 341

Векторное представление полного двоичного дерева

Основанное на векторе представление двоичного дерева (вспоминают Раздел 7.3.5) является особенно иском - способный для полного двоичного дерева T. Мы вспоминаем, что в этом внедрении, узлы T сохранены в векторе таким образом, что узел v в T является элементом с индексом, равным уровню номер f (v), определенному следующим образом:

• Если v - корень T, то f (v) = 1 • Если v - покинутый ребенок узла u, то f (v) = 2 f (u) • Если v - правильный ребенок узла u, то f (v) = 2 f (u) + 1

С этим внедрением у узлов T есть смежные индексы в диапазоне [1, n]

и последний узел T всегда в индексе n, где n - число узлов T. Рисунок 8.5 показывает два примера, иллюстрирующие эту собственность последнего узла.

w

w

(a) (b)

0123456 012345678

w w

(c) (d)

Рисунок 8.5: Два примера, показывая, что у последнего узла w кучи с n узлами есть уровень номер n: (a) куча T1 больше чем с одним узлом на нижнем уровне; (b) куча T2 с одним узлом на нижнем уровне; (c) основанное на векторе представление T1; (d) основанное на векторе представление T2.

Упрощения, которые прибывают из представления полного двоичного дерева T с векторной помощью во внедрении функций, добавляют и удаляют. Предполагая, что никакое расширение множества не необходимо, функции добавляют и удаляют, может быть выполнен в O (1) время, потому что они просто включают добавление или удаление последнего элемента вектора. Кроме того, у вектора, связанного с T, есть n + 1 элемент (элемент в индексе 0 - заполнитель). Если мы используем растяжимое множество, которое растет и сжимается для внедрения вектора (например, векторный класс STL), пространство, использованное основанным на векторе представлением полного двоичного дерева с n узлами, является O (n), и операции добавляют и удаляют, берут O (1) амортизируемое время.

342

Глава 8. Кучи и приоритетные очереди

C ++ внедрение полного двоичного дерева

Мы представляем полное двоичное дерево ADT как неофициальный интерфейс, названный Com-pleteTree, в Кодовом Фрагменте 8.11. Как с нашими другими неофициальными интерфейсами, это не полный C ++ класс. Это просто дает общественную часть класса.

Интерфейс определяет вложенный класс, названный Положением, которое представляет узел дерева. Мы обеспечиваем необходимые функции, чтобы получить доступ к корню и последним положениям и провести через дерево. Функции модификатора добавляют и удаляют, обеспечены, наряду с обменом функции, который обменивает содержание двух данных узлов.

шаблон <typename E>

класс CompleteTree //лево-заканчивают интерфейс дерева

общественность: //публично доступные типы

Положение класса; //размер интервала типа положения узла () константа; //Положение ряда элементов уехало (константа Position& p); //разбираются в оставленном детском Положении (константа Position& p); //получают правильного детского родителя Положения (константа Position& p); //получают родителя

bool hasLeft (константа Position& p) константа;//у узла есть оставленный ребенок? bool hasRight (константа Position& p) константа;//у узла есть правильный ребенок?

bool isRoot (константа Position& p) константа; корень Положения (); Положение в последний раз (); пустота addLast (константа E& e); пустота removeLast ();

//действительно ли это - корень?//получают положение корня / / g и l, поскольку t никакой de / / добавляют новый l, поскольку t никакой de//удаляют последний узел

недействительный обмен (константа Position& p, константа Position& q);//обменивают содержание узла

;

Кодовый Фрагмент 8.11: Соединяйте CompleteBinaryTree для полного двоичного дерева.

Чтобы осуществить этот интерфейс, мы храним элементы в векторе STL, названном V. Мы осуществляем позицию дерева iterator к этому вектору. Чтобы преобразовать из представления индекса узла к этому позиционному представлению, мы обеспечиваем функцию на месте продажи. Обратная конверсия обеспечена функцией idx. Эта часть определения класса дана в Кодовом Фрагменте 8.12.

частный: //членские данные

станд.:: вектор <E> V; //общественность содержания дерева: //публично доступные типы

typedef typename станд.:: вектор <E>:: Положение iterator;//положение в дереве

защищенный:

Положение на месте продажи (интервал i)

возвращают V.begin () + я;

интервал idx (константа Position& p) константа

возвращают p- V.begin ();

//защищенные сервисные функции//наносят на карту индекс к положению

//нанесите на карту положение к индексу

Кодовый Фрагмент 8.12: членские данные и частные утилиты для полного класса дерева.