Slide 1

Slide 1 text

26 ноября 2021 Артём Андреевич Вяткин, Валерий Дмитриевич Олисеенко Деревья Ассистент кафедры информатики [email protected]

Slide 2

Slide 2 text

2/41 Массив Структуры данных: рефлексия Список

Slide 3

Slide 3 text

3/41 Структуры данных: сложность Поиск Поиск по индексу Вставка / Удаление Начало Середина Конец Связный список O(n) O(n) O(1) O(1) + поиск по индексу O(1) | O(n) Массив O(n) O(1) 一 一 一 Динамический массив O(n) O(1) O(n) O(n) O(1)

Slide 4

Slide 4 text

4/41 Дерево

Slide 5

Slide 5 text

5/41 ● Важен быстрый поиск объектов ○ Реализация типа данных “Множество”, “Словарь” (set и map) ● Управление иерархией данных ○ Хранение структуры каталогов ● Синтаксический разбор выражений ○ Арифметические выражения ○ Анализ кода Область применения деревьев

Slide 6

Slide 6 text

6/41 ● N-арное дерево ● Сбалансированное дерево ● Двоичное дерево ● Двоичное дерево поиска ● АВЛ-дерево ● Красно-чёрное дерево ● 2—3 дерево ● Куча ● Двоичная куча = пирамида = сортирующее дерево Примеры деревьев

Slide 7

Slide 7 text

7/41 Двоичное дерево (поиска) Двоичное дерево, где для каждого узла: ● В левом поддереве все значения меньше, чем значения в узле ● В правом поддереве – больше

Slide 8

Slide 8 text

8/41 Двоичное дерево: реализация

Slide 9

Slide 9 text

9/41 Двоичное дерево в виде массива ● A[0] – корневой элемент ● Для A[i] потомками являются A[2i+1] и A[2i+2]

Slide 10

Slide 10 text

10/41 Поиск элемента: шаг 1

Slide 11

Slide 11 text

11/41 Поиск элемента: шаг 2

Slide 12

Slide 12 text

12/41 Поиск элемента: шаг 3

Slide 13

Slide 13 text

13/41 Поиск элемента: реализация

Slide 14

Slide 14 text

14/41 Вставка элемента: шаг 1

Slide 15

Slide 15 text

15/41 Вставка элемента: шаг 2

Slide 16

Slide 16 text

16/41 Вставка элемента: шаг 3

Slide 17

Slide 17 text

17/41 Вставка элемента: реализация

Slide 18

Slide 18 text

18/41 Находим вершину, которую хотим удалить a. У вершины нет детей – удаляем узел и обнуляем ссылку у родительского узла b. Если есть один ребенок – ставим ребенка на место текущей вершины c. Есть оба ребенка i. Если нет левого узла правого поддерева – копируем данные из правого узла в удаляемый и создаем ссылку на правый узел правого ребенка. ii. Иначе 1. Выберем самый левый узел L правого поддерева 2. Копируем данные из этого узла в удаляемый 3. Удалим L Удаление элемента: алгоритм

Slide 19

Slide 19 text

19/41 Удаление элемента: пример 1 У узла есть только один ребенок

Slide 20

Slide 20 text

20/41 У узла есть два ребенка, но нет левого узла правого поддерева Удаление элемента: пример 2

Slide 21

Slide 21 text

21/41 У узла есть оба ребенка, и есть левый узел правого поддерева Удаление элемента: пример 3

Slide 22

Slide 22 text

22/41 ● В среднем имеем сложность O(log(n)) для всех трех операций ● Однако в случае вырожденного дерева сложность операций будет равна O(n) Асимптотика работы с двоичным деревом

Slide 23

Slide 23 text

23/41 Обходы дерева. Прямой (Prefix) Порядок обхода: Текущая ➞ Левый сын ➞ Правый сын

Slide 24

Slide 24 text

24/41 Обходы дерева. Поперечный (Infix) Порядок обхода: Левый сын ➞ Текущая ➞ Правый сын

Slide 25

Slide 25 text

25/41 Обходы дерева. Обратный (Postfix) Порядок обхода: Правый сын ➞ Левый сын ➞ Текущая

Slide 26

Slide 26 text

26/41 Обход дерева в ширину (BFS) По «уровням» дерева

Slide 27

Slide 27 text

27/41 Обход дерева в глубину (DFS) Обход слева направо из глубины левой ветки

Slide 28

Slide 28 text

28/41 Самобалансирующиеся деревья ● Может появиться экстремально несбалансированное бинарное дерево поиска ● Что тогда делать? Применять самобалансирующиеся деревья! Сбалансированное бинарное дерево поиска — бинарное дерево поиска с логарифмической высотой. Примеры: ○ АВЛ-дерево ○ Красно-чёрное дерево ○ 2-3 дерево

Slide 29

Slide 29 text

29/41 ● Сбалансированное двоичное дерево поиска ● Критерий сбалансированности: высоты левого и правого поддеревьев любого узла различаются не более чем на единицу ● Показатель сбалансированности узла — высота правого поддерева минус высота левого поддерева ● Максимальная высота АВЛ-дерево

Slide 30

Slide 30 text

30/41 АВЛ-дерево: пример АВЛ-дерево не АВЛ-дерево

Slide 31

Slide 31 text

31/41 АВЛ-дерево: простой поворот Правый Левый

Slide 32

Slide 32 text

32/41 АВЛ-дерево: состояние расбалансировки Рассмотрим один из двух симметричных вариантов, при котором

Slide 33

Slide 33 text

33/41 АВЛ-дерево: пример простого поворота

Slide 34

Slide 34 text

34/41 АВЛ-дерево: двойной поворот

Slide 35

Slide 35 text

35/41 Вставка почти такая же, как и в ДДП: 1. Спускаемся по дереву, выбирая левое или правое направление и вставляем значение 2. При возвращении из рекурсии выполняем балансировку для текущего узла АВЛ-дерево: вставка элемента

Slide 36

Slide 36 text

36/41 АВЛ-дерево: удаление элемента Не забываем про балансировку!

Slide 37

Slide 37 text

37/41 1. Удаление элемента в двоичном дереве. 2. Вычисление высоты дерева. 3. Реализовать обходы бинарного дерева в глубину (DFS): a. прямой обход; b. обратный обход; c. центрированный обход. 4. Реализовать обход дерева в ширину (BFS). 5. Алгоритм Прима. 6. Алгоритм Краскала. 7. Реализация АВЛ-дерева. 8. (для присутствовавших на практике) задача про башню и охранников из контеста Яндекса Практические задания (до 03.12.2021)

Slide 38

Slide 38 text

38/41 Домашнее задания (до 10.12.2021) компилятор Напишите функцию, которая проверяет является ли дерево бинарным и если является, то проверить, является ли оно и двоичным деревом поиска. Вход: в качестве аргумента функции передается указатель на корень дерева. Выход: • -1 – если дерево НЕ двоичное. • 0 – если произвольное двоичное дерево. • 1 – если двоичное дерево поиска. ЛЕГКО

Slide 39

Slide 39 text

39/41 Домашнее задания (до 10.12.2021) компилятор Напишите функцию swapNodes, которая меняет две вершины в дереве с произвольным числом сыновей. Вход: в качестве аргумента функции передаются указатель на корень дерева, и глубины узлов в дереве (у корня глубина = 0, у его детей = 1 и т.д.) и порядковые их номера на уровне залегания (т.е. среди всех узлов глубины). Выход: вывести в консоль изначальную структуру дерева, порядок обхода дерева и поиска узлов и результат перестановки узлов в дереве. СРЕДНЕ

Slide 40

Slide 40 text

40/41 Домашнее задания (до 10.12.2021) компилятор Написать программу, реализующую алгоритм Борувки (по поиску минимального остовного дерева во взвешенном неориентированном связном графе) . Вход: указатель на первый элемент графа. Выход: вывести в консоль структуру полученного дерева. СЛОЖНО

Slide 41

Slide 41 text

26 ноября 2021 Артём Андреевич Вяткин, Валерий Дмитриевич Олисеенко Деревья Ассистент кафедры информатики [email protected]