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

8.3. Кучи 343

Учитывая индекс узла i, функция на месте продажи наносит на карту его к положению, добавляя

я к V.begin (). Здесь мы эксплуатируем факт, что вектор STL поддерживает произвольный доступ iterator (вспомните Раздел 6.2.5). В частности учитывая целое число i, выражение V.begin () + я привожу к положению ith элемента вектора, и,

учитывая положение p, выражение p-V.begin () приводит к индексу положения p.

Мы представляем полное осуществление основанного на векторе полного дерева ADT в Кодексе

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

шаблон <typename E>

класс VectorCompleteTree

//... вставьте данные члена парламента, не занимающего официального поста и защищенные утилиты здесь

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

VectorCompleteTree (): V (1)

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

Положение оставило (константа Position& p) право Положения (константа Position& p) родителем Положения (константа Position& p) bool hasLeft (константа Position& p) константа

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

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

возвращаются на месте продажи (2*idx (p));возвращаются на месте продажи (2*idx (p) + 1);возвращаются на месте продажи (idx (p)/2);возвращаются 2*idx (p) <= размер ();

bool hasRight (константа Position& p) константавозвращается 2*idx (p) + 1 <= размер ();

bool isRoot (константа Position& p) константа Возвращают idx (p) == 1;корень Положения () Возвращаются на месте продажи (1);Положение в последний раз () Возвращаются на месте продажи (размер ());пустота addLast (константа E& e) V.push назад (e);

пустота removeLast () V.pop назад ();

недействительный обмен (константа Position& p, константа Position& q)

E e = * q; * q = * p; * p = e;

;

Кодовый Фрагмент 8.13: основанное на векторе внедрение полного дерева ADT.

Вспомните из Раздела 7.3.5, что узел корня в индексе 1 вектора. Так как векторы STL внесены в указатель, начавшись в 0, наш конструктор создает начальный вектор с одним элементом. Этот элемент в индексе 0 никогда не используется. Как следствие размер приоритетной очереди - тот меньше, чем размер вектора.

Вспомните из Раздела 7.3.5 что, учитывая узел в индексе i, его левых и правых детях

расположены в индексах 2i и 2i + 1, соответственно. Его родитель расположен виндексе i/2 ⌋.

Учитывая положение p, функции уехали, право, и родитель сначала преобразовывает p в индекс

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

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

344