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

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

7.1.2 Функции дерева

Дерево ADT хранит элементы в узлах дерева. Поскольку узлы внутренние

аспекты нашего внедрения, мы не позволяем доступ им непосредственно. Вместо этого каждый узел дерева связан с объектом положения, который обеспечивает открытый доступ узлам. Поэтому, обсуждая общественные интерфейсы функций нашего ADT, мы используем примечание p (а не v), чтобы разъяснить, что аргумент функции - положение и не узел. Но, учитывая трудную связь между этими двумя объектами, мы часто пятнаем различие между ними и используем термины «положение» и «узел» попеременно для деревьев.

Когда мы сделали с положениями для списков в Главе 6, мы эксплуатируем C ++ способность перегрузить dereferencing оператора (» * «), чтобы получить доступ к элементу, связанному с положением. Учитывая переменную положения p, к связанному элементу получают доступ *p. Это может использоваться и для чтения и для изменения стоимости элемента.

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

Действительная мощность положения дерева является результатом своей способности получить доступ к соседним элементам дерева. Учитывая положение p дерева T, мы определяем следующее:

p.parent (): Возвратите родителя p; ошибка происходит, если p - корень.

p.children (): Возвратите список положения, содержащий детей узла p.

p.isRoot (): Возвратитесь верный, если p - корень и ложный иначе.

p.isExternal (): Возвратитесь верный, если p внешний и ложный иначе. Если дерево T заказано, то список, предоставленный p.children (), обеспечивает доступ к детям p в заказе. Если p - внешний узел, то p.children () возвращает пустой список. Если бы мы хотели, то мы могли бы также обеспечить функцию p.isInternal (), который просто возвратил бы дополнение p.isExternal ().

Само дерево обеспечивает следующие функции. Первые два, размер и пустой, являются просто стандартными функциями, что мы определили для других контейнерных типов нас, al - готовый видел. Корень функции приводит к положению корня, и положения производит список, содержащий узлы всего дерева.

размер (): Возвратите число узлов в дереве.

пустой (): Возвратитесь верный, если дерево пустое и ложное иначе.

корень (): Возвратите положение для корня дерева; ошибка происходит если

дерево пусто.

положения (): Возвратите список положения всех узлов дерева.

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

7.1. Общие деревья 273

7.1.3 C ++ интерфейс дерева

Давайте представим неофициальный интерфейс C ++ для дерева ADT. Мы начинаем, представляя неофициальный интерфейс C ++ для Положения класса, которое представляет положение в дереве. Это дано в Кодовом Фрагменте 7.1.

шаблон <typename E> //базируют тип элемента

Положение <E> класса 

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

//положение узла

E& оператор* (); родитель Положения () константа; дети PositionList () константа; bool isRoot () константа; bool isExternal () константа;

// // // // //

g et el ement добирается, родитель добираются, дети узла внедряют узел? внешний узел?

;

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

C ++ класс).

Мы обеспечили версию derferencing оператора (» * «), который возвращает стандарт (удобочитаемый и перезаписываемый) ссылка. (Для простоты мы не обеспечивали версию, которая возвращает постоянную ссылку, но это было бы легким дополнением.)

Затем, в Кодовом Фрагменте 7.2, мы представляем наш неофициальный интерфейс C ++ для дерева. Чтобы сохранять интерфейс максимально простым, мы игнорируем ошибочную обработку; следовательно, мы не объявляем, что любые исключения брошены.

шаблон <typename E> //базируют тип элемента

Дерево класса <E> 

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

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

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

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

;

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

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

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

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