- •Алгоритмы и структуры данных
- •Лабораторная работа №1 изучение методов оценки алгоритмов Краткая теория
- •Оценка порядка (временная оценка)
- •Порядок выполнения лабораторной работы
- •Содержание отчета о выполненной работе
- •Контрольные вопросы
- •Лабораторная работа №2 исследование и оценка алгоритмов поиска Краткая теория
- •Поиск. Основные определения и классы алгоритмов
- •2. Алгоритм дихотомического поиска
- •1. Алгоритм линейного поиска
- •3. Алгоритм интерполирующего поиска
- •Порядок выполнения лабораторной работы
- •Содержание отчета о выполненной работе
- •Контрольные вопросы
- •Лабораторная работа № 3 разработка рекурсивных алгоритмов Краткая теория
- •Понятие рекурсии и примеры ее использования
- •Порядок выполнения лабораторной работы
- •Содержание отчета о выполненной работе
- •Контрольные вопросы
- •Лабораторная работа №4 исследование и оценка алгоритмов сортировки Краткая теория
- •Сортировка. Основные определения и классы алгоритмов
- •Порядок выполнения лабораторной работы
- •Содержание отчета о выполненной работе
- •Контрольные вопросы
- •Лабораторная работа №5 исследование и оценка алгоритмов поиска на деревьях Краткая теория
- •Построение бинарного дерева
- •Включение узла в двоичное дерево
- •Включение узла в в дерево
- •Удаление узла из бинарного дерева
- •Удаление узла из в дерева
- •Обход дерева
- •Инфиксный (симметричный) обход дерева
- •Поиск элемента в дереве
- •Поиск элемента двоичного дерева
- •Поиск элемента в дерева
- •Порядок выполнения лабораторной работы Подготовка к работе
- •Последовательность выполнения лабораторной работы
- •Содержание отчета о выполненной работе
- •Контрольные вопросы
- •Библиографический список
- •Типы алгоритмов, исследуемых в лабораторной работе 1
- •Типы алгоритмов, исследуемых в лабораторной работе 2
- •Типы алгоритмов, исследуемых в лабораторной работе 3
- •Типы алгоритмов, исследуемых в лабораторной работе 4
- •Типы деревьев, исследуемых в лабораторной работе 5
- •Оглавление
Включение узла в двоичное дерево
Добавление элемента (ДОБАВИТЬ)
Дано: дерево Т и пара (K,V – ключ и вершина).
Задача: добавить пару (K, V) в дерево Т.
Алгоритм включения узла в дерево
Если дерево пусто, заменить его на дерево с одним корневым узлом ((K,V), ПУСТО, ПУСТО) и остановиться
Иначе сравнить K с ключом корневого узла X:
1.1. Если K>=X, рекурсивно добавить (K,V) в правое поддерево Т
Иначе (если K<X) рекурсивно добавить (K,V) в левое поддерево Т.
Включение узла в в дерево
Введём определение: дерево потомков узла – это поддерево, состоящее из самого узла и его потомков.
Вначале определим функцию, которая добавляет элемент с ключом K к дереву потомков узла X. После выполнения функции во всех пройденных узлах, кроме, может быть, самого узла X, будет меньше 2t – 1, но не меньше t – 1 ключей. Величина t определяется из формулы:
m = 2(t – 1).
Алгоритм добавления элемента к дереву потомков
Если Х – не лист
Определяем интервал, где должен находиться K. Пусть Y – соответствующий сын.
Рекурсивно добавляем K к дереву потомков Y.
Если узел Y полон, то есть содержит 2t − 1 ключей, расщепляем его на два. Узел Y1 получает первые t − 1 ключей Y, и первые t его потомков, а узел Y2 – последние t − 1 ключей Y и последние t его потомков. Средний из ключей узла Y попадает в узел Х, а указатель на Y в узле X заменяется указателями на узлы Y1 и Y2.
Если X – лист, просто добавляем туда ключ K.
Теперь сформулируем алгоритм добавления элемента с ключом K ко всему дереву. Буквой R обозначим корневой узел.
Алгоритм добавления элемента к В дереву
Добавим K к дереву потомков R.
Если в результате R содержит 2t − 1 ключей, расщепляем его на два. Узел R1 получает первые t − 1 из ключей R и первые t его потомков, а R2 – последние t − 1 из ключей R и последние t его потомков. Средний из ключей узла R попадает вo вновь созданный узел, который становится корневым. Узлы R1 и R2 становятся его потомками.
Зачастую добавление элемента приводит к полному или частичному сдвигу всех узлов дерева. Таким образом, эта операция является одной из наиболее трудоемких.
Удаление узла из бинарного дерева
Удаление узла (УДАЛИТЬ)
Дано: дерево Т с корнем n и ключом K.
Задача: удалить из дерева Т узел с ключом K (если такой есть).
Алгоритм удаления узла из дерева
Если дерево T пусто, остановиться
Иначе сравнить K с ключом X корневого узла n.
Если K>X, рекурсивно удалить K из правого поддерева Т
Иначе если K<X, рекурсивно удалить K из левого поддерева Т.
Если K=X, то необходимо рассмотреть два случая.
Если одного из детей нет, то значения второго ребёнка m ставим вместо соответствующих значений корневого узла, затирая его старые значения, и освобождаем память, занимаемую узлом m.
Если оба потомка присутствуют, то
найдём узел m, являющийся самым левым узлом правого поддерева;
скопируем значения полей (ключ, значение) узла m в соответствующие поля узла n.
у предка узла m заменим ссылку на узел m ссылкой на правого потомка узла m (который может быть равен ПУСТО).
освободим память, занимаемую узлом m (на него теперь никто не указывает, а его данные были перенесены в узел n).
