- •2. Структуры данных. Элементарные данные.
- •3. Линейные структуры данных. Массив.
- •4. Линейные структуры данных. Запись.
- •5. Линейные структуры данных. Множество.
- •6. Линейный однонаправленный список. Способы реализации и основные операции.
- •7. Линейный двунаправленный список. Способы реализации и основные операции.
- •8. Циклический однонаправленный список. Способы реализации и основные операции.
- •9. Циклический двунаправленный список. Способы реализации и основные операции.
- •10. Стек. Способы реализации и основные операции.
- •11. Очередь. Способы реализации и основные операции.
- •12. Дек. Способы реализации и основные операции.
- •13. Мультисписки. Способы реализации и основные операции.
- •14. Слоёные списки. Способы реализации и основные операции.
- •15. Графы. Способы реализации и основные операции.
- •16. Общие сведения о деревьях. Двоичные деревья. Основные определения и способы реализации.
- •17. Обходы деревьев.
- •18. Организация файлов. Общие сведения.
- •21. Методы разработки алгоритмов
- •22. Алгоритмы поиска в линейных структурах. Последовательный (линейный) поиск
- •23. Алгоритмы поиска в линейных структурах. Бинарный поиск
- •24. Хеширование данных. Функция хеширования
- •25. Хеширование данных. Открытое хеширование
- •26. Хеширование данных. Закрытое хеширование
- •27. Поиск данных по вторичным ключам
- •28. Упорядоченные деревья поиска. Способы реализации и основные операции
- •29. Случайные деревья поиска и оптимальные деревья поиска. Основные понятия
- •31. Поиск в тексте. Прямой поиск
- •32. Поиск в тексте. Алгоритм Кнута, Мориса и Пратта
- •33. Поиск в тексте. Алгоритм Боуера и Мура
- •34. Общие сведения об алгоритмах кодирования (сжатия) данных. Метод Хаффмана
- •35. Алгоритм внутренней сортировки подсчетом
- •36. Алгоритм внутренней сортировки простым включением
- •37. Алгоритм внутренней сортировки простым извлечением
- •38. Алгоритм внутренней сортировки методом пузырька
- •39. Алгоритм внутренней быстрой сортировки (Хоара)
- •40. Алгоритм внутренней сортировки слиянием
- •41. Алгоритм внутренней сортировки распределением
- •42. Алгоритмы внешней сортировки
- •43. Алгоритм определения циклов в графе
- •45. Алгоритмы обхода графа. Поиск в ширину (Волновой алгоритм)
- •46. Алгоритмы нахождения кратчайшего пути в графе. Алгоритм Дейкстры
- •47. Алгоритмы нахождения кратчайшего пути в графе. Алгоритм Флойда
- •49. Алгоритмы нахождения минимального остовного дерева графа. Алгоритм Крускала
16. Общие сведения о деревьях. Двоичные деревья. Основные определения и способы реализации.
Дерево является одним из самых важных и интересных частных случает в графа, поэтому оно рассматривается отдельно от графов других видов.
Деревом называют орграф, для которого:
существует узел, в который не входит ни одной дуги (корень)
в каждую вершину, кроме корня, входит одна дуга
Вершины дерева подразделяют на три группы
- корень – не входит ни одной дуги
- узлы – входит одна дуга и выходит одна или более дуг
- листья – входит одна дуга и не выходит ни одной дуги
Все вершины, в которые входят дуги, исходящие из одной вершины, называют потомками этой вершины, а сама вершина – предком. Корень не имеет предка, а листья не имеют потомков.
Выделяют уровни дерева. На первом уровне может быть только одна вершина – корень, на втором – потомки корня и т.д.
Поддеревом называется вершина со всеми её потомками.
Высотой поддерева будем считать максимальную длину цепи.........
Высота пустого дерева равна 0, высота дерева из одного корня – единице.
Степенью вершины в дереве называется количество дуг, которое из неё выходит. Степень дерева равна максимальной степени вершины, входящей в дерево. При этом листьями в дереве являются вершины, имеющий степень ноль.
По величине степени дерева часто различают два типа деревьев:
-двоичные – степень дерева не больше 2
- сильно ветвящиеся – степень произвольная
Дерево произвольной степени можно реализовывать как любой граф. Однако, учитывая специфику дерева как частного случая графа, можно рассмотреть отдельный способ реализации – как динамическую структуру в виде списка. Списочное представление деревьев произвольной степени основано на элементах, соответствующих вершинам дерева. Каждый элемент имеет поле данных и два поля указателей: указатель на начало списка потомков вершины и указатель на следующий элемент в списке потомков текущего уровня.
При таком способе представления дерева обязательно следует сохранять указатель на вершину, являющуюся корнем дерева.
По степени вершин двоичные деревья бывают:
строгие – вершины дерева имеют степень нуль (у листьев) или два (у узлов)
нестрогие –вершины дерев имеют степень нуль, один или два
В общем случае на к-том уровне двоичного дерева может быть до 2^к-1 вершин.
Двоичное дерево, содержащее только полностью заполненные уровни, называется полным.
Двоичное дерево можно реализовывать как статическую структуру данных в виде одномерного массива, а можно как динамическую структуру – в виде списка.
Списочное представление двоичных деревьев основано на элементах, соответствующих узлам дерева. Каждый элемент имеет поле даных и два поля указателей. Один указатель используется для связывания элемента с правым потомком, а другой – с левым. Листья имеют пустые указатели потомков. При таком представлении дерева обязательно следует сохранять указатель на узел, являющийся корнем дерева.
В виде массива проще всего представляется полное двоичное дерево, так как оно всегда имеет строго определённое число вершин а каждом уровне. Вершины можно пронумеровать слева направо последовательно по уровням и использовать эти номера в качестве индексов в одномерном массиве. Если число уровней дерева в процессе обработки не будет существенно изменяться, то такой способ представления полного двоичного дерева будет значительно более экономичным, чем любая списковая структура.
Адрес любой вершины вычисляется так
адрес = 2^(к-1) + i- 1
Где к- номер уровня вершины, i – номер на уровне к в полном двоичном дереве.
Адрес корня будет равен 1. Для любой вершины, имеющей индекс jв массиве, можно вычислить адреса левого и правого потомков:
Адрес_левого = 2*j
Адрес_правого = 2*j+1
Главным недостатком статического способа представления двоичного дерево является то, что массив имеет фиксированную длину. Размер массива выбирается исходя из максимального возможного количества уровней дерева, и чем менее полным является дерево, тем менее рационально используется память. Кроме того, недостатком являются большие накладные расходы при изменении структуры дерева (например, при обмене местами двух поддеревьев).
Основные операции.
Реализация операций будет рассматриваться для двоичных деревьев, представленных как динамическая структура.
В качестве основных операций двоичными деревьями рассмотрим операцию прямого обхода двоичного дерева в рекурсивной форме и нерекурсивной форме. Реализация обратного и симметричного обходов аналогична. Операции добавления, поиска и удаления вершин дерева зависят от принятого порядка вершин, поэтому будут представлены далее, когда будут упорядоченные деревья.
В процедуре, реализующей нерекурсивный обход двоичного дерева, используется стек, хранящий пусть от корня дерев до предка текущей вершины.
Процедура работает в двух режимах. В первом режиме осуществляется обход по направлению к левым потомкам до тех пор пока не встретится лист, при этом выполняется печать значений вершин, и занесение указателей на них в стек. Во втором режиме осуществляется возврат по пройденному пути с поочерёдным извлечением указателей из стека до тех пор, пока не встретится вершина, имеющая еще не напечатанного правого потомка. Тогда процедура переходит в первый режим и исследует новый путь, начина с этого потомка.
