Лекции 13-14.ppt
- Количество слайдов: 32
Программирование и структуры данных 2007 г. Лекции 13 -14 Деревья. Создание и обход бинарного дерева. Древовидные таблицы Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 1
Программирование на языке высокого уровня Деревья Дерево – это связный граф без циклов. Связным называют граф, в котором для любых двух вершин существует связывающий их путь. Дерево из n вершин имеет n-1 ребер. Дерево с одной выделенной вершиной называют корневым, а выделенную вершину – корнем дерева. Корневое дерево обычно рассматривают как ориентированное от корня (реже к корню), но изображают без стрелок. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 2
Программирование на языке высокого уровня Уровень вершины определяется расстоянием вершины от корня. Высота дерева – это максимальный уровень его вершин. Преемников вершины называют сыновьями, а предшественника – родителем или отцом. Степень вершины – число ее сыновей. Вершины без сыновей называют терминальными или листьями. Дуги называют ветвями. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 3
Программирование на языке высокого уровня Корневое дерево А - корень D В Вершины уровня 1 (отец) С (сын) G H Вершины уровня 2 F Z X Y Бикмурзина А. Р. V W E Вершины уровня 3 листья КГТУ (КАИ), кафедра АСОИУ 4
Программирование на языке высокого уровня Примеры деревьев 1. Структура организации и ее подразделений. 2. Родословное дерево. 3. Структура книги, состоящей из разделов и подразделов. 4. Структура сложной программы, где корень дерева – главная функция, вершины 1 -го уровня – подпрограммы, вызываемые из главной функции и т. д. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 5
Программирование на языке высокого уровня Дерево называется упорядоченным, если сыновья каждой вершины упорядочены каким-либо образом. Бинарное (двоичное) дерево – упорядоченное дерево степени 2: каждая вершина имеет не более 2 -х сыновей, образующих корни ее левого и правого поддерева. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 6
Программирование на языке высокого уровня Бинарное дерево Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 7
Программирование на языке высокого уровня Представление деревьев Деревья чаще всего хранят в виде сетей или списковых структур. Каждый элемент сети содержит номер или метку вершины и указатели на элементы-сыновья. В регулярной (однородной) сети число указателей у элементов одинаковое, а в нерегулярной сети – разное. Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 8
Программирование на языке высокого уровня Пример представления дерева в виде сетей и списковой структуры КГТУ (КАИ), кафедра АСОИУ 9
Программирование и структуры данных 2007 г. Пример. Использование бинарного дерева для сортировки данных • Допустим дана последовательность чисел, например: • 15 10 20 12 8 17 25 5 9 • Вывести числа в порядке возрастания: • 5 8 9 10 12 15 17 20 25 Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 10
Программирование и структуры данных 2007 г. Построим бинарное дерево: первое число будет корнем дерева. Если второе число < 1 -го, то оно станет корнем левого поддерева, а если > 1 -го, то станет корнем правого поддерева. Каждое следующее число будет добавляться либо в левое поддерево, либо в правое. Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 11
Программирование и структуры данных 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. Создание бинарного дерева в виде регулярной сети. • 2. Обход дерева слева направо и вывод меток его вершин (чисел). • 3. Удаление дерева (освобождение памяти). Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 13
Программирование и структуры данных 2007 г. Программа #include
Программирование на языке высокого уровня // Прототипы функций void insert (TREE *pt, float x); void print_tree (TREE *pt); void delete_tree (TREE *pt); КГТУ (КАИ), кафедра АСОИУ 15
Программирование и структуры данных 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("%f", &x) != EOF) insert (pt, x); // обход дерева и печать результата puts ("Результат: "); print_tree (pt); // удаление дерева delete_tree (pt); } Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 17
Программирование и структуры данных 2007 г. /*-------------------------------------*/ /* Функция включения новой вершины в дерево */ /*-------------------------------------*/ void insert (TREE *pt, float x) // pt - указатель на корень дерева // x – число - метка новой вершины { TREE *i; /* указатель на текущую вершину дерева */ TREE *parent; /* указатель на вершинуродителя для новой вершины */ int dir; /* признак включения новой вершины в левую или правую ветвь */ Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 18
Программирование и структуры данных 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 *) 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 г. /*---------------------------------*/ /* Рекурсивная функция обхода дерева снизу */ /* вверх и удаления его вершин */ /*---------------------------------*/ 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 г. Три способа обхода бинарного дерева Прямой обход (обход сверху вниз): 1. Корень 2. Левое поддерево 3. Правое поддерево Внутренний обход (обход слева направо): 1. Левое поддерево 2. Корень 3. Правое поддерево Обратный обход (обход снизу вверх): 1. Левое поддерево 2. Правое поддерево 3. Корень Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 24
Программирование и структуры данных 2007 г. Дерево выражения и способы его обхода Элементарное выражение операция операнд 1 операнд 2 Прямой обход: операция операнд-1 операнд-2 Внутренний обход: операнд-1 операция операнд-2 Обратный обход: операнд-1 операнд-2 операция Бикмурзина А. Р КГТУ (КАИ), кафедра АСОИУ 25
Программирование и структуры данных 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 * Search (AVTO *pt, char number[]) /* Вх. данные: pt – указатель таблицы, number – ключ - номер автомобиля */ /* Функция возвращает адрес найденного элемента или NULL, если элемента нет в таблице */ { AVTO *i = pt; /* указатель на очередной элемент таблицы */ Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 30
Программирование на языке высокого уровня 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]; // искомый номер автомобиля AVTO *p; // указатель на найденный элемент puts (“Введите номер”); gets (num); if (p = Search(pt, num)) printf (“Владелец: %s, дата техосмотра: %s”, p -> fam, p -> date ); else puts (“Данного номера нет в базе данных”); Бикмурзина А. Р. КГТУ (КАИ), кафедра АСОИУ 32