
- •Определение алгоритма
- •Классификация языков
- •Модификаторы доступа
- •Объявление переменных
- •Локальные переменные
- •Формальные параметры
- •Глобальные переменные
- •Спецификаторы хранения
- •Оператор присваивания
- •Инициализация переменных
- •Константы
- •Операторы
- •Оператор ?
- •Операторы указания & и *
- •Оператор sizeof
- •Оператор «запятая»
- •Выражения
- •Преобразования типов в выражениях
- •Принудительные преобразования типов
- •Оператор break
- •Оператор continue
- •Метки и goto
- •Одномерный массив
- •Создание указателя на массив
- •Двумерные массивы
- •Массивы строк
- •Многомерные массивы
- •Индексация с помощью указателей
- •Размещение массивов
- •Функции
- •Оператор return
- •Правила видимости для функций
- •Аргументы функции. Передача по значению и передача по указателю
- •Передача массивов в функции
- •Аргументы функции main()
- •Возврат указателей
- •Указатели на функции
- •Структуры
- •Доступ к членам структуры
- •Присваивание структур
- •Массивы структур
- •Указатели на структуры
- •Битовые поля
- •Объединения
- •Перечисления
- •Использование typedef
- •Ввод, вывод, потоки и файлы
- •Форматированный консольный ввод-вывод
- •Модификаторы формата
- •Файловая система ansi c
- •Запись и чтение символа
- •Использование feof()
- •Работа со строками: fgets() и fputs()
- •Указатели
- •Односвязные списки
- •Обход односвязного списка
- •63.Бинарное дерево поиска. Вставка и поиск элемента по ключу в бинарном дереве поиска. Поиск элемента (find)
- •Добавление элемента (insert)
- •64.Бинарное дерево поиска. Удаление элемента из бинарного дерева поиска. Удаление узла (remove)
- •65.Обход бинарного дерева
- •66.Балансировка бинарного дерева поиска
-
Обход односвязного списка
Алгоритм обхода односвязного списка посещает каждый пункт списка. При этом над каждым пунктом выполняется какая-либо операция, например, вывод содержания на экран или изменение данных.
p = List;
while(p != NULL)
{
printf("%d ", p->Object);
p = p->Next;
}
Можно выполнить этот обход и при помощи цикла for:
for(p = List; p != NULL; p = p->Next) printf("%d ", p->Object);
Бинарное дерево поиска
Поле, по которому производится поиск, называется поисковым ключом, или просто ключом.
Для каждого узла N бинарное дерево поиска удовлетворяет следующим трём условиям:
-
Значение поискового ключа узла N больше всех значений поисковых ключей, содержащихся в левом поддереве TL.
-
Значение поискового ключа узла N меньше всех значений поисковых ключей, содержащихся в правом поддереве TR.
-
Деревья TL и TR являются бинарными деревьями поиска.
Алгоритм симметричного обхода бинарного дерева поиска посещает узлы в порядке, определённом их поисковыми ключами.
63.Бинарное дерево поиска. Вставка и поиск элемента по ключу в бинарном дереве поиска. Поиск элемента (find)
Дано: дерево Т и ключ K.
Задача: проверить, есть ли узел с ключом K в дереве Т, и если да, то вернуть ссылку на этот узел.
Алгоритм:
-
Если дерево пусто, сообщить, что узел не найден, и остановиться.
-
Иначе сравнить K со значением ключа корневого узла X.
-
Если K=X, выдать ссылку на этот узел и остановиться.
-
Если K>X, рекурсивно искать ключ K в правом поддереве Т.
-
Если K<X, рекурсивно искать ключ K в левом поддереве Т.
-
Добавление элемента (insert)
Дано: дерево Т и пара (K,V).
Задача: добавить пару (K, V) в дерево Т.
Алгоритм:
-
Если дерево пусто, заменить его на дерево с одним корневым узлом ((K,V), null, null) и остановиться.
-
Иначе сравнить K с ключом корневого узла X.
-
Если K>=X, рекурсивно добавить (K,V) в правое поддерево Т.
-
Если K<X, рекурсивно добавить (K,V) в левое поддерево Т.
-
64.Бинарное дерево поиска. Удаление элемента из бинарного дерева поиска. Удаление узла (remove)
Дано: дерево Т с корнем n и ключом K.
Задача: удалить из дерева Т узел с ключом K (если такой есть).
Алгоритм:
-
Если дерево T пусто, остановиться;
-
Иначе сравнить K с ключом X корневого узла n.
-
Если K>X, рекурсивно удалить K из правого поддерева Т;
-
Если K<X, рекурсивно удалить K из левого поддерева Т;
-
Если K=X, то необходимо рассмотреть три случая.
-
Если обоих детей нет, то удаляем текущий узел и обнуляем ссылку на него у родительского узла;
-
Если одного из детей нет, то значения полей ребёнка m ставим вместо соответствующих значений корневого узла, затирая его старые значения, и освобождаем память, занимаемую узлом m;
-
Если оба ребёнка присутствуют, то
-
найдём узел m, являющийся самым левым узлом правого поддерева с корневым узлом Right(n);
-
скопируем данные (кроме ссылок на дочерние элементы) из m в n;
-
рекурсивно удалим узел m.
-
-
-