Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структуры и алгоритмы обработки данных.doc
Скачиваний:
348
Добавлен:
12.03.2015
Размер:
1.81 Mб
Скачать

5.5. Контрольные вопросы по теме

  1. В чем состоит основное отличие древовидных структур от списковых?

  2. Как рекурсивно определяется дерево?

  3. Какие типы вершин существуют в деревьях?

  4. Какие можно выделить типы деревьев?

  5. Какие деревья называются двоичными?

  6. Какие деревья называются упорядоченными?

  7. Какие основные понятия связываются с деревьями?

  8. Какие основные операции характерны при использовании деревьев?

  9. Какую структуру имеют вершины двоичного дерева?

  10. Почему для деревьев существует несколько правил обхода вершин?

  11. Какие правила обхода вершин дерева являются основными?

  12. Как выполняется обход дерева в прямом направлении?

  13. Как выполняется обход дерева в симметричном направлении?

  14. Как выполняется обход дерева в обратном направлении?

  15. Как выполняется обход дерева в обратно-симметричном направлении?

  16. Почему рекурсивная реализация правил обхода является наиболее удобной?

  17. Что происходит при рекурсивном выполнении обхода дерева?

  18. Как программно реализуется обход дерева в прямом направлении?

  19. Как программно реализуется обход дерева в симметричном направлении?

  20. Как программно реализуется обход дерева в обратном направлении?

  21. Какой формальный параметр необходим для рекурсивной реализации правил обхода и как он используется?

  22. В чем состоит суть нерекурсивной реализации процедур обхода?

  23. Какая вспомогательная структура данных необходима для нерекурсивной реализации обхода дерева и как она используется?

  24. Опишите схему процедуры для нерекурсивного обхода дерева.

  25. Как выполняется поиск в дереве вершины с заданным ключом?

  26. Как правильно выполнить уничтожение всей древовидной структуры?

  27. Какое дерево называется идеально сбалансированным?

  28. В чем заключается значимость идеально сбалансированных деревьев с точки зрения организации поиска?

  29. Опишите алгоритм построения идеально сбалансированного дерева.

  30. В чем состоит принципиальное отличие алгоритмов обхода деревьев от алгоритма построения идеально сбалансированного дерева?

  31. Почему ссылочный параметр в рекурсивной процедуре построения идеально сбалансированного дерева должен быть параметром-переменной?

  32. Какие формальные параметры должна иметь рекурсивная подпрограмма построения идеально сбалансированного дерева и для чего они используются?

  33. Приведите программную реализацию процедуры построения идеально сбалансированного дерева.

Тема 6. Реализация поисковых деревьев

    1. Двоичные деревья поиска.

Деревья поиска – частный, но практически, пожалуй, наиболее важный вид двоичных деревьев. Будем считать, что каждая вершина имеет некое ключевоеполе, позволяющееупорядочитьмножество вершин. Двоичное дерево называется деревом поиска или поисковым деревом, если длякаждойвершины дерева все ключи в еелевомподдеревеменьшеключа этой вершины, а все ключи в ееправомподдеревебольшеключа вершины.

Пример дерева поиска с целыми ключами представлен на следующем рисунке.

Деревья поиска являются одной из наиболее эффективных структур построения упорядоченныхданных. Как известно, в упорядоченном массиве очень эффективно реализуется поиск (дихотомия!), но очень тяжело выполнить добавление и удаление элементов. Наоборот, в упорядоченном списке легко реализуется добавление и удаление элементов, но не эффективна реализация поиска из-за необходимости последовательного просмотра всех элементов, начиная с первого. Деревья поиска позволяютобъединить преимуществамассивов и линейных списков: легко реализуется добавление и удаление элементов, а также эффективно выполняется поиск.

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

Например, если идеально сбалансированное ДП имеет 1000 вершин, то даже в наихудшем случае потребуется не более 10 сравнений (2 в степени 10 есть 1024), а если число вершин 1 миллион, то потребуется не более 20 сравнений.

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

Интересно заметить, что обход ДП в симметричном порядке позволяет получить исходный набор данных в соответствии с заданным упорядочиванием, а обход в обратно-симметричном порядке – в обратном порядке.

Алгоритм поискав ДП очень прост:

Начиная с корневой вершины для каждого текущего поддерева надо выполнить следующие шаги:

  • сравнить ключ вершины с заданным значением x

  • если заданное значение меньше ключа вершины, перейти к левому потомку, иначе перейти к правому поддереву.

Поиск прекращается при выполнении одного из двух условий:

  • либо если найден искомый элемент

  • либо если надо продолжать поиск в пустом поддереве, что является признаком отсутствия искомого элемента

Интересно, что поиск очень легко можно реализовать простым циклом, без использования рекурсии:

pCurrent := pRoot; {начинаем поиск с корня дерева}

Stop := false;

While (pCurrent <> nil) and (not Stop) do

if x < pCurrent ^.inf then pCurrent := pCurrent^.left else

if x > pCurrent ^.inf then pCurrent := pCurrent^.right else Stop := true;