- •Структуры данных. Классификация
- •Алгоритмы. Определение. Как алгоритмы соотносятся со структурами данных.
- •Оценка сложности алгоритма. Способы. Меры оценки сложности.
- •Оценка сложности алгоритма. Худший, лучший случай и в среднем.
- •Массивы и сортировка массивов. Сортировка Шелла.Алг. Сложность
- •Массивы и сортировка массивов. Быстрая сортировка. Алг. Сложность
- •Списки. Виды списков. Организация списков при помощи массивов.
- •Стек. Организация стека при помощи массива, динамической структуры.
- •Очередь. Организация очереди при помощи массива. Динамической структуры.Двух стеков.
- •Деревья. Определения. Высота, степень дерева, степень узла. Бинарные деревья.
- •Бинарные деревья. Организация бинарных деревьев при помощи массива.
- •Бинарные деревья поиска. Организация деревьев при помощи динамических структур.
- •Бинарные деревья поиска. Операции. Удаление элементов из дерева. Случай 1. Узел — лист (нет потомков)
- •🔹 Случай 2. У узла один потомок (только левое или только правое поддерево)
- •🔹 Случай 3. У узла два потомка
- •Бинарные деревья. Стратегии обхода деревьев. В ширину.
- •Бинарные деревья. Стратегии обхода деревьев. В глубину.
- •Графы. Способы задания графов. Матрица инцидентности. Матрица смежности.
- •🔸 1. Матрица смежности
- •🔸 2. Матрица инцидентности
- •Графы. Обходы графов. Поиск в ширину и глубину.
- •Кратчайшие пути на графах. Алгоритм дейстры
- •Хранение данных в формате json
Бинарные деревья. Организация бинарных деревьев при помощи массива.
Всё дерево записывается в массив по уровням: сначала корень, потом его дети слева направо, потом внуки — опять слева направо, и так далее.
Например: — Корень дерева всегда записывается в нулевую ячейку массива. — Если узел находится в ячейке с номером i, то: • его левый потомок будет в ячейке с номером 2·i + 1, • его правый потомок — в ячейке 2·i + 2. — А если вы знаете номер ячейки узла (кроме корня), то его родитель всегда находится в ячейке с номером (i − 1) / 2, где деление целочисленное — то есть дробная часть отбрасывается.
Такая нумерация работает автоматически, как только дерево записано в массив по уровням — слева направо, сверху вниз. Благодаря этому структура дерева полностью определяется только порядком элементов в массиве, и никакие дополнительные ссылки хранить не нужно.
Бинарные деревья поиска. Организация деревьев при помощи динамических структур.
Бинарные деревья поиска. Операции. Удаление элементов из дерева. Случай 1. Узел — лист (нет потомков)
Просто удаляем узел.
Указатели у его родителя на этот узел устанавливаются в NULL.
Пример: Удаляем узел с ключом 4, у которого нет левого и правого поддерева → просто освобождаем память и обнуляем соответствующий указатель у родителя.
🔹 Случай 2. У узла один потомок (только левое или только правое поддерево)
Узел удаляется, а его единственный потомок поднимается на его место.
Родитель удаляемого узла теперь ссылается на этого потомка.
Пример: Узел 9 имеет только правое поддерево (12). После удаления 9 его родитель (8) начинает указывать напрямую на 12.
🔹 Случай 3. У узла два потомка
Это наиболее сложный случай. Прямое удаление нарушит структуру BST. Поэтому применяется следующая стратегия:
Находим преемника (successor) — это наименьший узел в правом поддереве (или, альтернативно, предшественник (predecessor) — наибольший в левом поддереве).
Копируем значение преемника в удаляемый узел.
Удаляем преемника, который гарантированно имеет не более одного потомка (так как он — самый левый в поддереве → у него нет левого потомка).
Бинарные деревья. Стратегии обхода деревьев. В ширину.
Обход бинарного дерева в ширину (Breadth-First Search, BFS) — это стратегия, при которой узлы дерева посещаются по уровням: сначала корень (уровень 0), затем все узлы уровня 1 (слева направо), потом — уровня 2 и так далее, пока не будут обработаны все узлы.
Реализуется с помощью очереди.
Бинарные деревья. Стратегии обхода деревьев. В глубину.
Обход бинарного дерева — это процесс посещения всех его узлов по одному разу в определённом порядке.
Один из главных подходов — это обход в глубину (Depth-First Search, DFS). При таком обходе мы сначала идём как можно глубже по одной ветке, доходим до листа, а потом возвращаемся назад, чтобы исследовать другие ветки.
В бинарных деревьях обход в глубину делится на три основных стратегии, в зависимости от того, в какой момент мы обрабатываем (например, выводим) значение текущего узла:
1. Прямой обход (Pre-order)
Порядок: корень → левое поддерево → правое поддерево. Сначала обрабатываем сам узел, затем рекурсивно обходим левого ребёнка, потом — правого.
Пример: такой обход часто используется для создания копии дерева или вывода структуры (например, в виде префиксной записи выражения).
2. Центральный (симметричный) обход (In-order)
Порядок: левое поддерево → корень → правое поддерево. Сначала идём влево, потом обрабатываем узел, потом — вправо.
В бинарном дереве поиска такой обход выводит все элементы в порядке возрастания — это его главное преимущество.
3. Обратный обход (Post-order)
Порядок: левое поддерево → правое поддерево → корень. Сначала полностью обходим левое поддерево, потом правое, и только в самом конце обрабатываем текущий узел.
Такой обход используется, например, при удалении дерева — сначала удаляем детей, потом родителя, чтобы не потерять ссылки.
