Скачать презентацию Программирование и структуры данных 2007 г Лекции 13 Скачать презентацию Программирование и структуры данных 2007 г Лекции 13

Лекции 13-14.ppt

  • Количество слайдов: 32

Программирование и структуры данных 2007 г. Лекции 13 -14 Деревья. Создание и обход бинарного Программирование и структуры данных 2007 г. Лекции 13 -14 Деревья. Создание и обход бинарного дерева. Древовидные таблицы Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 1

Программирование на языке высокого уровня Деревья Дерево – это связный граф без циклов. Связным Программирование на языке высокого уровня Деревья Дерево – это связный граф без циклов. Связным называют граф, в котором для любых двух вершин существует связывающий их путь. Дерево из n вершин имеет n-1 ребер. Дерево с одной выделенной вершиной называют корневым, а выделенную вершину – корнем дерева. Корневое дерево обычно рассматривают как ориентированное от корня (реже к корню), но изображают без стрелок. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 2

Программирование на языке высокого уровня Уровень вершины определяется расстоянием вершины от корня. Высота дерева Программирование на языке высокого уровня Уровень вершины определяется расстоянием вершины от корня. Высота дерева – это максимальный уровень его вершин. Преемников вершины называют сыновьями, а предшественника – родителем или отцом. Степень вершины – число ее сыновей. Вершины без сыновей называют терминальными или листьями. Дуги называют ветвями. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 3

Программирование на языке высокого уровня Корневое дерево А - корень D В Вершины уровня Программирование на языке высокого уровня Корневое дерево А - корень D В Вершины уровня 1 (отец) С (сын) G H Вершины уровня 2 F Z X Y Бикмурзина А. Р. V W E Вершины уровня 3 листья КГТУ (КАИ), кафедра АСОИУ 4

Программирование на языке высокого уровня Примеры деревьев 1. Структура организации и ее подразделений. 2. Программирование на языке высокого уровня Примеры деревьев 1. Структура организации и ее подразделений. 2. Родословное дерево. 3. Структура книги, состоящей из разделов и подразделов. 4. Структура сложной программы, где корень дерева – главная функция, вершины 1 -го уровня – подпрограммы, вызываемые из главной функции и т. д. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 5

Программирование на языке высокого уровня Дерево называется упорядоченным, если сыновья каждой вершины упорядочены каким-либо Программирование на языке высокого уровня Дерево называется упорядоченным, если сыновья каждой вершины упорядочены каким-либо образом. Бинарное (двоичное) дерево – упорядоченное дерево степени 2: каждая вершина имеет не более 2 -х сыновей, образующих корни ее левого и правого поддерева. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 6

Программирование на языке высокого уровня Бинарное дерево Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ Программирование на языке высокого уровня Бинарное дерево Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 7

Программирование на языке высокого уровня Представление деревьев Деревья чаще всего хранят в виде сетей Программирование на языке высокого уровня Представление деревьев Деревья чаще всего хранят в виде сетей или списковых структур. Каждый элемент сети содержит номер или метку вершины и указатели на элементы-сыновья. В регулярной (однородной) сети число указателей у элементов одинаковое, а в нерегулярной сети – разное. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 8

Программирование на языке высокого уровня Пример представления дерева в виде сетей и списковой структуры Программирование на языке высокого уровня Пример представления дерева в виде сетей и списковой структуры КГТУ (КАИ), кафедра АСОИУ 9

Программирование и структуры данных 2007 г. Пример. Использование бинарного дерева для сортировки данных • Программирование и структуры данных 2007 г. Пример. Использование бинарного дерева для сортировки данных • Допустим дана последовательность чисел, например: • 15 10 20 12 8 17 25 5 9 • Вывести числа в порядке возрастания: • 5 8 9 10 12 15 17 20 25 Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 10

Программирование и структуры данных 2007 г. Построим бинарное дерево: первое число будет корнем дерева. Программирование и структуры данных 2007 г. Построим бинарное дерево: первое число будет корнем дерева. Если второе число < 1 -го, то оно станет корнем левого поддерева, а если > 1 -го, то станет корнем правого поддерева. Каждое следующее число будет добавляться либо в левое поддерево, либо в правое. Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 11

Программирование и структуры данных 2007 г. Дерево из чисел: 15 10 20 12 8 Программирование и структуры данных 2007 г. Дерево из чисел: 15 10 20 12 8 17 25 5 9 15 10 8 5 20 12 17 25 9 При обходе дерева слева направо получаем упоряд. посл-ть: 5 8 9 10 12 15 17 20 25 Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 12

Программирование и структуры данных 2007 г. Алгоритм • 1. Создание бинарного дерева в виде Программирование и структуры данных 2007 г. Алгоритм • 1. Создание бинарного дерева в виде регулярной сети. • 2. Обход дерева слева направо и вывод меток его вершин (чисел). • 3. Удаление дерева (освобождение памяти). Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 13

Программирование и структуры данных 2007 г. Программа #include <stdio. h> #include <stdlib. h> /* Программирование и структуры данных 2007 г. Программа #include #include /* Описание бинарного дерева в виде регулярной сети */ // Тип вершины дерева (элемента сети) struct TREE { float number; // число TREE *left, *right; /* указатели на левое и правое поддеревья*/ }; Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 14

Программирование на языке высокого уровня // Прототипы функций void insert (TREE *pt, float x); Программирование на языке высокого уровня // Прототипы функций void insert (TREE *pt, float x); void print_tree (TREE *pt); void delete_tree (TREE *pt); КГТУ (КАИ), кафедра АСОИУ 15

Программирование и структуры данных 2007 г. /*-------------------*/ /* Главная функция */ /*-------------------*/ void main() Программирование и структуры данных 2007 г. /*-------------------*/ /* Главная функция */ /*-------------------*/ void main() { TREE *pt; // указатель на корень дерева float x; // очередное число puts ("n. Введите числовую последовательность"); scanf("%f", &x); // создание корня дерева pt = (TREE *) malloc (sizeof(TREE)); pt->number=x; pt->left=pt->right=NULL; Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 16

Программирование на языке высокого уровня // ввод чисел и формирование дерева while (scanf( Программирование на языке высокого уровня // ввод чисел и формирование дерева while (scanf("%f", &x) != EOF) insert (pt, x); // обход дерева и печать результата puts ("Результат: "); print_tree (pt); // удаление дерева delete_tree (pt); } Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 17

Программирование и структуры данных 2007 г. /*-------------------------------------*/ /* Функция включения новой вершины в дерево Программирование и структуры данных 2007 г. /*-------------------------------------*/ /* Функция включения новой вершины в дерево */ /*-------------------------------------*/ void insert (TREE *pt, float x) // pt - указатель на корень дерева // x – число - метка новой вершины { TREE *i; /* указатель на текущую вершину дерева */ TREE *parent; /* указатель на вершинуродителя для новой вершины */ int dir; /* признак включения новой вершины в левую или правую ветвь */ Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 18

Программирование и структуры данных 2007 г. /* спуск по дереву и поиск вершиныродителя для Программирование и структуры данных 2007 г. /* спуск по дереву и поиск вершиныродителя для новой вершины*/ i = pt; while (i != NULL) { parent = i; if (x < i->number) { // спуск влево i = i->left; dir = 0; } else { // спуск вправо i = i->right; dir = 1; } } Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 19

Программирование и структуры данных 2007 г. /* создание новой вершины */ i = (TREE Программирование и структуры данных 2007 г. /* создание новой вершины */ i = (TREE *) malloc (sizeof (TREE)); i->number = x; i->left = i->right = NULL; /* включение новой вершины в левую или правую ветвь родителя*/ if (dir == 0) parent->left = i; else parent->right = i; } Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 20

Программирование на языке высокого уровня /*-----------------------------------*/ /* Рекурсивная функция обхода дерева слева */ /* Программирование на языке высокого уровня /*-----------------------------------*/ /* Рекурсивная функция обхода дерева слева */ /* направо и печати его вершин */ /*-----------------------------------*/ void print_tree (TREE *pt) /* pt - указатель на корень дерева (поддерева) */ { if (pt) { print_tree (pt->left); printf ("%f ", pt->number); print_tree (pt->right); } } Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 21

Программирование и структуры данных 2007 г. /*---------------------------------*/ /* Рекурсивная функция обхода дерева снизу */ Программирование и структуры данных 2007 г. /*---------------------------------*/ /* Рекурсивная функция обхода дерева снизу */ /* вверх и удаления его вершин */ /*---------------------------------*/ void delete_tree (TREE *pt) // pt - указатель на корень дерева (поддерева) { if (pt) { delete_tree (pt->left); delete_tree (pt->right); free (pt); } } Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 22

Программирование и структуры данных • Можно было в данной задаче создать бинарное дерево в Программирование и структуры данных • Можно было в данной задаче создать бинарное дерево в виде трех параллельных массивов: 2007 г. 0 1 2 3 4 5 6 7 8 9 Бикмурзина А. Р 15 1 2 10 4 3 20 5 6 12 -1 -1 8 7 8 17 -1 -1 25 -1 -1 9 -1 -1 КГТУ (КАИ), кафедра АСОИУ 23

Программирование и структуры данных 2007 г. Три способа обхода бинарного дерева Прямой обход (обход Программирование и структуры данных 2007 г. Три способа обхода бинарного дерева Прямой обход (обход сверху вниз): 1. Корень 2. Левое поддерево 3. Правое поддерево Внутренний обход (обход слева направо): 1. Левое поддерево 2. Корень 3. Правое поддерево Обратный обход (обход снизу вверх): 1. Левое поддерево 2. Правое поддерево 3. Корень Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 24

Программирование и структуры данных 2007 г. Дерево выражения и способы его обхода Элементарное выражение Программирование и структуры данных 2007 г. Дерево выражения и способы его обхода Элементарное выражение операция операнд 1 операнд 2 Прямой обход: операция операнд-1 операнд-2 Внутренний обход: операнд-1 операция операнд-2 Обратный обход: операнд-1 операнд-2 операция Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 25

Программирование и структуры данных 2007 г. Пример дерева выражения 1+2*a–b/(c+d) + 1 / * Программирование и структуры данных 2007 г. Пример дерева выражения 1+2*a–b/(c+d) + 1 / * 2 Прямой обход: b a + c d -+1*2 a/b+cd Внутренний обход : 1 + 2 * a – b / ( c + d ) Обратный обход: 12 a*+bcd+/КГТУ (КАИ), кафедра АСОИУ 26

Программирование на языке высокого уровня Древовидные таблицы Древовидная таблица (дерево поиска) – это бинарное Программирование на языке высокого уровня Древовидные таблицы Древовидная таблица (дерево поиска) – это бинарное дерево, в котором вершины соответствуют элементам таблицы. Ключ каждой вершины больше ключей ее левого поддерева и меньше ключей правого поддерева. Ключи могут быть любого типа (сравниваются их числовые коды). Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 27

Программирование на языке высокого уровня Пример • База данных содержит сведения о владельцах автомобилей. Программирование на языке высокого уровня Пример • База данных содержит сведения о владельцах автомобилей. Необходимо по номерам машин устанавливать их владельцев. • Для более быстрого поиска можно построить древовидную таблицу, где ключом элемента будет номер автомобиля. Каждый элемент таблицы будет содержать ключ, тело и два указателя на левое и правое поддеревья. У левого поддерева ключи будут < чем у корня, а у правого >. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 28

Программирование на языке высокого уровня Описание таблицы в виде сети (С++) // структура элемента Программирование на языке высокого уровня Описание таблицы в виде сети (С++) // структура элемента struct AVTO { char number[12]; // номер автомобиля char fam[30]; // фамилия, имя, отчество char date[9]; // дата техосмотра AVTO *left, *right; /* указатели на левое и правое поддеревья */ }; AVTO *pt; /* указатель таблицы (на корень дерева) */ Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 29

Программирование на языке высокого уровня /* Функция поиска элемента по ключу */ AVTO * Программирование на языке высокого уровня /* Функция поиска элемента по ключу */ AVTO * Search (AVTO *pt, char number[]) /* Вх. данные: pt – указатель таблицы, number – ключ - номер автомобиля */ /* Функция возвращает адрес найденного элемента или NULL, если элемента нет в таблице */ { AVTO *i = pt; /* указатель на очередной элемент таблицы */ Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 30

Программирование на языке высокого уровня while (i && strcmp (number, i ->number)) { if Программирование на языке высокого уровня while (i && strcmp (number, i ->number)) { if (strcmp (number, i ->number)<0) i = i -> left; else i = i -> right; } return i; } Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 31

Программирование на языке высокого уровня Пример вызова функции char num[12]; // искомый номер автомобиля Программирование на языке высокого уровня Пример вызова функции char num[12]; // искомый номер автомобиля AVTO *p; // указатель на найденный элемент puts (“Введите номер”); gets (num); if (p = Search(pt, num)) printf (“Владелец: %s, дата техосмотра: %s”, p -> fam, p -> date ); else puts (“Данного номера нет в базе данных”); Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 32