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

10.1. Деревья двоичного поиска 433

В Кодовом Фрагменте 10.4, мы представляем главные части определения класса для

наше дерево двоичного поиска. Мы начинаем, определяя публично доступные типы для входа, ключа, стоимости и класса iterator. Это сопровождается декларацией общественных членских функций. Мы определяем два местных типа, BinaryTree и TPos, которые представляют дерево двоичного поиска и положение в пределах этого двоичного дерева, соответственно. Мы также объявляем, что много местных сервисных функций помогают в открытии, вставке и стирании записей. Членские данные состоят из двоичного дерева и числа записей в дереве.

шаблон <typename E>

класс SearchTree

//

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

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

//

общественные типы

typedef typename E:: Ключ K;

//

ключ

typedef typename E:: Стоимость V;

//

стоимость

класс Iterator;

//

iterator/position

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

//

государственные функции

SearchTree ();

//

конструктор

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

//

число записей

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

//

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

Iterator находят (константа K& k);

//

найдите вход с ключом k

Вставка Iterator (константа K& k, константа V& x);

//

вставка (k, x)

пустота стирает (константа K& k) бросок (NonexistentElement); //удаляют ключ k вход

пустота стирает (константа Iterator& p);

//

удалите вход в p

Iterator начинаются ();

//

iterator к первому входу

Конец Iterator ();

//

iterator, чтобы закончить вход

защищенный:

//

местные утилиты

typedef BinaryTree <E> BinaryTree;

//

связанное двоичное дерево

typedef typename BinaryTree:: Положение TPos;

//

положение в дереве

Корень TPos () константа;

//

получите виртуальный корень

Искатель TPos (константа K& k, константа TPos& v);

//

найдите полезность

Вставка TPos (константа K& k, константа V& x);

//

полезность вставки

Резинка TPos (TPos& v);

//

сотрите полезность

TPos реструктурируют (константа TPos& v)

//

реструктурировать

бросок (BoundaryViolation);

частный:

//

членские данные

BinaryTree T;

//

двоичное дерево

интервал n;

//

число записей

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

//.. .insert декларация класса Iterator здесь

;

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

Мы опустили определение iterator класса для нашего дерева двоичного поиска. Это представлено в Кодовом Фрагменте 10.5. iterator состоит из единственного положения в дереве. Мы перегружаем dereferencing оператора (» *, «), чтобы обеспечить оба читают -

434

Глава 10. Деревья поиска только и читают - пишут доступ к узлу, на который ссылается iterator. Мы также предоставляем оператору для проверки равенства двух iterators. Это полезно для проверки, равен ли iterator концу.

класс Iterator //iterator/position

частный:

TPos v; //, который общественность входа:

Iterator (константа TPos& vv): v (vv) //конструктор

константа E& оператор* () константавозвращается *v;//добираются, вход (читайте только),

E& оператор* ()возвращаются *v;

оператор bool == (константа Iterator& p) константа

возвращают v == p.v;

Iterator& оператор ++ ();

друг класс SearchTree;

//доберитесь вход (чтение-запись)//равный iterators?

//преемник inorder//предоставляет доступ дерева поиска

;

Кодовый Фрагмент 10.5: Декларация класса Iterator, который является частью SearchTree.

Кодовый Фрагмент 10,6 подарков определение оператора приращения iterator, который достижения iterator от данного положения дерева его inorder преемнику. Только внутренние узлы посещают, так как внешние узлы не содержат записи. Если у узла v есть правильный ребенок, inorder преемник - крайний левый внутренний узел его правильного поддерева. Иначе, v должен быть самым большим ключом в левом поддереве некоторого узла w. Чтобы найти w, мы идем по дереву через последовательных предков. Пока мы - правильный ребенок нынешнего предка, мы продолжаем двигаться вверх. Когда это больше не верно, родитель - желаемый узел w. Обратите внимание на то, что мы используем сжатое примечание функции, которое мы ввели в Разделе 9.2.7, где грязное вовлечение определителей обзора SearchTree было опущено.

/* SearchTree E:: */

Iterator& Iterator:: оператор ++ ()

TPos w = v.right ();

если (w.isInternal ())

сделайтеv = w; w = w.left ();

в то время как (w.isInternal ());

еще

w = v.parent ();

в то время как (v == w.right ())

v = w; w = w.parent ();

v = w;

возвратитесь *это;

//преемник inorder

//имеет правильное поддерево?//спускают оставленную цепь

//доберитесь родитель//перемещают правильную цепь вверх

//и сначала свяжитесь с левым

Кодовый Фрагмент 10.6: оператор приращения (» ++ «) для Iterator.