Скачиваний:
123
Добавлен:
17.03.2015
Размер:
751.62 Кб
Скачать

Пример 2.

BinSTree<int> T; //Дерево с целочисленными данными

T.Insert(50); //Создать дерево с четырьмя узлами (A)

T.Insert(40);

T.Insert(70);

T.Insert(45);

T.Delete(40); // удалить узел 40 (B)

T.ClearList(); // удалить узлы дерева

// дерево univInfo содержит информацию о студентах.

// Поле ssn является ключевым

BinSTree<Student> univInfo;

Student stud;

//Назначить ключ "9876543789" и найти его на дереве

stud.ssn = "9876543789";

if (univInfo.Find(stud))

{

//Студент найден.

//Присвоить новый средний балл и обновить узел

stud.gpa = 3.86;

univInfo.Update(stud);

}

else

cout << "Студент отсутствует в базе данных." << endl;

Использование бинарных деревьев поиска

Класс BinSTree — мощная структура данных, которая используется для обработки динамических списков. Перед рассмотрением примера практической задачи построения конкорданса рассмотрим несколько более простых примеров. Под конкордансом здесь понимается алфавитный список всех слов заданного текста с указателями на места их появлений. Рассмотрим ряд простых программ, где применяются деревья поиска.

Создание примеров деревьев поиска.

В разделе «Структура бинарного дерева» функция MakeCharTree использовалась для создания ряда бинарных деревьев с символьными данными. Создадим похожую функцию MakeSearchTree, строящую бинарные деревья поиска с целочисленными данными, применяя метод Insert. Первое дерево SearchTree_0 создается на базе массива arr0. В этом примере переменная Т имеет тип BinSTree.

int arr0[6] = {30, 20, 45, 5, 10, 40};

for (i = 0; i < 6; i++)

T.Insert(arr0[i]); //Добавить элемент к дереву

Еще два дерева, SearchTree_1 и SearchTree_2, создайте сами. Первое из них должно быть восьмиэлементным деревом, а второе – деревом с десятью случайными числами из диапазона 10-99 (Рис. 12). Номер создаваемого дерева должен передаваться функции MakeSearchTree в качестве параметра. В качестве другого параметра функция должна получать указатель на переменную типа BinSTree.

 Рис. 12. Деревья, создаваемые с помощью функции MakeSearchTree

Симметричный метод прохождения

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

Дублированные узлы

Бинарное дерево поиска может иметь дублированные узлы. В операции вставки мы продолжаем сканировать правое поддерево, если наш новый элемент совпадает с данными в текущем узле. В результате в правом поддереве совпавшего узла возникают дублированные узлы.

Например, следующее дерево генерируется из списка 50 70 25 90 30 55 25 15 25.

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

Соседние файлы в папке Лабораторная работа4 Деревья