- •Алгоритмы и структуры данных
- •Лабораторная работа №1 изучение методов оценки алгоритмов Краткая теория
- •Оценка порядка (временная оценка)
- •Порядок выполнения лабораторной работы
- •Содержание отчета о выполненной работе
- •Контрольные вопросы
- •Лабораторная работа №2 исследование и оценка алгоритмов поиска Краткая теория
- •Поиск. Основные определения и классы алгоритмов
- •2. Алгоритм дихотомического поиска
- •1. Алгоритм линейного поиска
- •3. Алгоритм интерполирующего поиска
- •Порядок выполнения лабораторной работы
- •Содержание отчета о выполненной работе
- •Контрольные вопросы
- •Лабораторная работа № 3 разработка рекурсивных алгоритмов Краткая теория
- •Понятие рекурсии и примеры ее использования
- •Порядок выполнения лабораторной работы
- •Содержание отчета о выполненной работе
- •Контрольные вопросы
- •Лабораторная работа №4 исследование и оценка алгоритмов сортировки Краткая теория
- •Сортировка. Основные определения и классы алгоритмов
- •Порядок выполнения лабораторной работы
- •Содержание отчета о выполненной работе
- •Контрольные вопросы
- •Лабораторная работа №5 исследование и оценка алгоритмов поиска на деревьях Краткая теория
- •Построение бинарного дерева
- •Включение узла в двоичное дерево
- •Включение узла в в дерево
- •Удаление узла из бинарного дерева
- •Удаление узла из в дерева
- •Обход дерева
- •Инфиксный (симметричный) обход дерева
- •Поиск элемента в дереве
- •Поиск элемента двоичного дерева
- •Поиск элемента в дерева
- •Порядок выполнения лабораторной работы Подготовка к работе
- •Последовательность выполнения лабораторной работы
- •Содержание отчета о выполненной работе
- •Контрольные вопросы
- •Библиографический список
- •Типы алгоритмов, исследуемых в лабораторной работе 1
- •Типы алгоритмов, исследуемых в лабораторной работе 2
- •Типы алгоритмов, исследуемых в лабораторной работе 3
- •Типы алгоритмов, исследуемых в лабораторной работе 4
- •Типы деревьев, исследуемых в лабораторной работе 5
- •Оглавление
Удаление узла из в дерева
При удалении узла (ключа) могут возникнуть две проблемы:
Удалённый элемент является разделителем потомков внутри какого-либо нелистового узла;
После удаления в узле может остаться менее допустимого m/2 числа потомков.
Для того чтобы устранить эти проблемы, требуется перебалансировка дерева. Она может быть выполнена после удаления узла (ключа) или до него. Рассмотрим первый вариант.
Алгоритм удаления узла из В дерева
Если корень одновременно является листом (в дереве всего один узел), удаляем ключ из этого узла.
В противном случае находим узел, содержащий ключ, запоминая путь к нему. Пусть этот узел – X.
Если X – лист, удаляем оттуда ключ.
Если в узле X осталось не меньше t − 1 ключей, останавливаемся. Иначе проверяем количество ключей в следующем, а потом в предыдущем узле.
Если следующий узел есть, и в нём не менее t ключей, добавляем в X ключ-разделитель между ним и следующим узлом, а на его место ставим первый ключ следующего узла, после чего останавливаемся.
В противном случае, если есть предыдущий узел, и в нём не менее t ключей, добавляем в X ключ-разделитель между ним и предыдущим узлом, а на его место ставим последний ключ предыдущего узла, после чего останавливаемся.
Наконец, если и с предыдущим ключом не получилось, объединяем узел X со следующим или предыдущим узлом, и в объединённый узел перемещаем ключ, разделяющий два узла. При этом в родительском узле может остаться только t − 2 ключа. Тогда, если это не корень, выполняем аналогичную процедуру с ним.
Если в результате дошли до корня, и в нём осталось от 1 до t − 1 ключей, остановка, потому что корень может иметь и меньше t − 1 ключей.
Если в корне не осталось ни одного ключа, исключаем корневой узел, а его единственный потомок делаем новым корнем дерева.
Если X – не лист, а K – его i-й ключ, удаляем самый правый ключ из поддерева потомков i-го сына X, или, наоборот, самый левый ключ из поддерева потомков (i + 1)-го сына X.
Обход дерева
Обход дерева может выполняться одним из следующих способов:
«сверху вниз» или префиксный обход (функция_прямого_вызова) — обойти всё дерево по порядку (вершина, левое поддерево, правое поддерево);
«снизу вверх» или постфиксный обход (функция_обратного_вызова) — обойти всё дерево по порядку (левое поддерево, правое поддерево, вершина);
«симметричный обход» или инфиксный обход (функция_симметричного_вызова) — обойти всё дерево по порядку (левое поддерево, вершина, правое поддерево).
Эти процедуры, судя по названию и описанию, имеют рекурсивный характер. Их алгоритмы можно описать следующим образом.
ИНФИКСНЫЙ_ОБХОД позволяет обойти все узлы дерева в порядке возрастания ключей и применить к каждому узлу заданную пользователем функцию обратного вызова. Эта функция обычно работает только c парой (K,V), хранящейся в узле. Операция ИНФИКСНЫЙ_ОБХОД реализуется рекурсивным образом: сначала она запускает себя для левого поддерева, потом выполняет функцию обратного вызова для корня, а затем вызывает себя для правого поддерева.
