Скачать презентацию Тема 7 Древовидные структуры данных ØПонятие древовидной структуры Скачать презентацию Тема 7 Древовидные структуры данных ØПонятие древовидной структуры

Лекция_28_29_Древовидные структуры.ppt

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

Тема 7 Древовидные структуры данных ØПонятие древовидной …структуры данных ØБинарное дерево поиска 2/17/2018 1 Тема 7 Древовидные структуры данных ØПонятие древовидной …структуры данных ØБинарное дерево поиска 2/17/2018 1

Понятие древовидной структуры данных Ø При решении игровых задач мы встретились с понятием дерева, Понятие древовидной структуры данных Ø При решении игровых задач мы встретились с понятием дерева, которое использовалось в качестве математической модели для представления множества возможных вариантов. Ø Ø Познакомились с рекурсивным алгоритмом обхода всех узлов и листьев дерева и построенным на нем методом ветвей и границ. Ø Древовидная модель оказывается довольно эффективной и для представления динамических данных с целью быстрого поиска информации. 2/17/2018 2

Древовидное размещение списка данных {a b c d e f g k m} корневой Древовидное размещение списка данных {a b c d e f g k m} корневой узел (корень) а b d c e f k 2/17/2018 узлы второго уровня g m d, e, g, k, m - листы 3

Основные определения Ø Если два узла соединены направленной дугой (x y) то Ø х Основные определения Ø Если два узла соединены направленной дугой (x y) то Ø х - предшественник (родитель), Ø у – преемник (сын, дочь). Ø Корень - узел, у которого нет родителя. Ø Лист - Узел, не имеющий преемников Ø Ø Внутренний узел – это узел, не являющийся листом или корнем. Ø Ø Порядок узла – количество его дочерних узлов. Ø Ø Степень дерева – максимальный порядок его узлов Ø Глубина узла равна числу его предков плюс 1. Ø Глубина дерева – это наибольшая глубина его узлов. Ø Дерево, представленное выше имеет степень 3 (троичное), глубину 4, корневой узел а, листы d, e, g, k, m 2/17/2018 4

Для реализации древовидных структур данных степени m используется следующая конструкция рекурсивного типа данных Type Для реализации древовидных структур данных степени m используется следующая конструкция рекурсивного типа данных Type Ttree=^tree • tree=Record • Inf: TInf; • A 1: Ttree; • A 2: Ttree; • . . . • • Am: Ttree; • end; 2/17/2018 //A 1. . Am – указатели //на сестер //если сестра //отсутствует, то //адрес равен Nil 5

Пример прямого размещения данных • • Var proot, p: Ttree; //Указатели: на корень и Пример прямого размещения данных • • Var proot, p: Ttree; //Указатели: на корень и текущий узел • • • • New(proot); p: =Proot; p^. Inf: =’a’; p^. A 2: =Nil; New(P^. A 3); p: =P^. A 3; P^. Inf: =’c’; P^. A 1: =Nil; P^. A 2: =Nil; New(P^. A 3); p: =P^. A 3; p^. Inf: =’g’; P^. A 1: =Nil; p^. A 2: =Nil; p^. A 3: =Nil; p=Proot; New(P^. A 1); p: =p^. A 1; p^. Inf: =’b’; New(P^. A 1); P^. A 1. Inf: =’d’; P^. A 1: =Nil; p^. A 1^. A 2: =Nil; p^. A 1^. A 3: =Nil; New(P^. A 2); p^. A 2. Inf: =’e’; P^. A 2^. A 1: =Nil; P^. A 2: =Nil; p^. A 2^. A 3: =Nil; New(p^. A 3); p: =P^. A 3; p^. Inf: =’f’; p^. A 2: =Nil; New(p^. A 1); p^. A 1. Inf: =’k’; P^. A 1: =Nil; p^. A 1^. A 2: =Nil; p^. A 1^. A 3: =Nil; New(p^. A 3); p^. A 3. Inf: =’m’; P^. A 3^. A 1: =Nil; P^. A 3^. A 2: =Nil; P^. A 3: =Nil . . . 2/17/2018 6

Ø После того как дерево заполнено информацией, его нужно уметь просмотреть, распечатать, осуществить поиск. Ø После того как дерево заполнено информацией, его нужно уметь просмотреть, распечатать, осуществить поиск. Ø Как видно из вышеприведенного фрагмента программы, непосредственное заполнение даже небольшого дерева требует довольно громоздкой последовательности команд. Ø Ø Поэтому для работы с деревьями используют набор специфических алгоритмов, оформленных в виде методов класса. 2/17/2018 7

Обходом дерева называется последовательное обращение ко всем его узлам. • Procedure Wrttree(p: Ttree); • Обходом дерева называется последовательное обращение ко всем его узлам. • Procedure Wrttree(p: Ttree); • //p - указатель на текущий узел при входе p: =proot • begin • if p<>Nil then //если дочь отсутствует то выход • begin • //печать при прямом обходе • Wrttree(p^. A 1); • Wrttree(p^. A 2); • . . . • Wrttree(p^. Am); • // печать при обратном обходе • end; p: =proot; Wrttree(p); 2/17/2018 8

Прямой обход а b d c e k 2/17/2018 g f m 9 Прямой обход а b d c e k 2/17/2018 g f m 9

Обратный обход а b d c e k 2/17/2018 g f m 10 Обратный обход а b d c e k 2/17/2018 g f m 10

 • • Var proot, p: Ptree; // Function Poisktree(k): Tinf Var bl: boolean; • • Var proot, p: Ptree; // Function Poisktree(k): Tinf Var bl: boolean; Поиск при обходе • • • • Procedure Po(var p: Ttree); //обход Begin If bl and (p<>Nil) then If p^. inf. key=k then bl: =false else begin Po(p. A 1); Po(p. A 2); . . . Po(p. Am); end; //Po begin p: =proot; bl: =true; Po(p); If bl then Print(’поиск неудачен’) else Result: =p^. Inf; • End; //Poisktree • 2/17/2018 11

Поиск при обходе • Обращение • Inf: =Poisktree(k); 2/17/2018 12 Поиск при обходе • Обращение • Inf: =Poisktree(k); 2/17/2018 12

Удаление дерева из памяти производится обратным обходом • • • Procedure Delete. Tree(var p: Удаление дерева из памяти производится обратным обходом • • • Procedure Delete. Tree(var p: Ttree); Begin If (p<>Nil) then begin Delete. Tree(p^. A 1); Delete. Tree(p^. A 2); . . . Delete. Tree(p^. Am); Dispose(p); p: =Nil; end; • Обращение: Delete. Tree(proot); 2/17/2018 13

Бинарное дерево поиска 1 0 6 1 2 5 8 2 0 3 0 Бинарное дерево поиска 1 0 6 1 2 5 8 2 0 3 0 2 1 • ключи расположены таким образом, что для любого узла значение ключа в узле больше чем у всех его левых преемников и меньше, чем у всех правых. • key: 1, 6, 8, 10, 21, 25, 30. 2/17/2018 14

Ø Ввиду своеобразной организации эффективность поиска информации в такой динамической структуре данных сравнима с Ø Ввиду своеобразной организации эффективность поиска информации в такой динамической структуре данных сравнима с эффективностью двоичного поиска в массиве, т. е. имеет оценку эффективности О(log 2 n). Ø Заметим что двоичный поиск в линейном связанном списке организовать невозможно, а эффективность линейного поиска имеет порядок О(n). Ø Ø Конечно, оценка О(log 2 n) справедлива для сбалансированного дерева, т. е. такого у которого узлы, имеющие только одну дочь, имеют глубину равную или на единицу меньшую глубины дерева. 2/17/2018 15

Сбалансированное и несбалансированное деревья 6 1 1 0 6 1 2 0 3 0 Сбалансированное и несбалансированное деревья 6 1 1 0 6 1 2 0 3 0 2 1 2/17/2018 1 0 2 5 8 8 2 0 2 1 2 5 3 0 16

Основные операции с бинарным деревом поиска Ø обход дерева; Ø Ø вставка информации с Основные операции с бинарным деревом поиска Ø обход дерева; Ø Ø вставка информации с новым значением ключа не изменяя свойств дерева поиска; Ø формирование сбалансированного дерева поиска; Ø поиск заданного ключа; Ø поиск минимального (максимального) ключа; Ø удаление информации с заданным ключом; Ø удаление дерева. 2/17/2018 17

Класс для работы с деревом • Type • Ttree=^Tree • Tree=Record • Inf: TInf; Класс для работы с деревом • Type • Ttree=^Tree • Tree=Record • Inf: TInf; • A 1, A 2: Ttree; • end; • TBtr=Class(tobject) • proot, p, q, v, w: Ttree; • Constructor Create; • Procedure Wrt 1; • Procedure Add(Inf: TInf); • Function poisk(k: Tkey): TInf; • Procedure Make(a: Tms; n: word); • . . . • Destructor Free; • end; 2/17/2018 18

Работа с деревом • Var tr: TBtr; • • Begin. . tr: =TBtr. Create; Работа с деревом • Var tr: TBtr; • • Begin. . tr: =TBtr. Create; tr. Add(inf); tr. Wrt 1; . . tr. Free; 2/17/2018 19

Создать дерево • Constructor TBtr. create; • Begin • Inherited create; • proot: =nil; Создать дерево • Constructor TBtr. create; • Begin • Inherited create; • proot: =nil; • End; 2/17/2018 20

Удалить дерево • Destructor TBtr. Free; • Procedure Del(var p: Ttree); • begin • Удалить дерево • Destructor TBtr. Free; • Procedure Del(var p: Ttree); • begin • If (p<>Nil) then begin • Del(p^. A 1); • Del(p^. A 2); • Dispose(p); • p: =Nil; • end; • Begin • Del(proot); inherited free; • end; 2/17/2018 21

Симметричный обход слева направо • Procedure TBtr. Wrt 1; • Procedure Wr(p: Ttree); • Симметричный обход слева направо • Procedure TBtr. Wrt 1; • Procedure Wr(p: Ttree); • begin • if p<>nil then • begin • Wr(p^. A 1); • Print(p^. Inf); • Wr(p^. A 2); • end; • begin • p: =proot; wr(p) • end; 2/17/2018 22

Симметричный обход слева направо 1 0 6 1 2 5 8 2 0 3 Симметричный обход слева направо 1 0 6 1 2 5 8 2 0 3 0 2 1 1 6 8 10 20 21 25 30 2/17/2018 23

Симметричный обход справа налево • Procedure TBtr. Wrt 2; • Procedure Wr(p: Ttree); • Симметричный обход справа налево • Procedure TBtr. Wrt 2; • Procedure Wr(p: Ttree); • begin • if p<>nil then • begin • Wr(p^. A 2); • Print(p^. Inf); • Wr(p^. A 1); • end; • begin • p: =proot; wr(p) • end; 2/17/2018 24

Симметричный обход справа налево Procedure Wr(p: Ttree); begin if p<>nil then begin Wr(p^. A Симметричный обход справа налево Procedure Wr(p: Ttree); begin if p<>nil then begin Wr(p^. A 2); Print(p^. Inf); Wr(p^. A 1); end; 1 0 6 1 2 5 8 2 0 3 0 2 1 30 25 21 20 10 8 6 1 2/17/2018 25

Поиск ключа не требует рекурсии 20>10 Найти 20 1 0 20<25 6 1 2 Поиск ключа не требует рекурсии 20>10 Найти 20 1 0 20<25 6 1 2 5 8 2 0 3 0 2 1 Затраты на поиск пропорциональны глубине дерева О(log 2 n). 2/17/2018 26

Метод poisk(k) • Const nok: Tkey=’некоторое значение<>key’; • Function TBtr. poisk(k: Tkey): Tinf; • Метод poisk(k) • Const nok: Tkey=’некоторое значение<>key’; • Function TBtr. poisk(k: Tkey): Tinf; • begin p: =Proot; • While(p<>nil) and (p^. Inf. key<>k) do • If kNil then Result: =p^. inf • else Result. key: =nok; • end; • Обращение к методу • Inf: =tr. poisk(k); • If inf. key=nok then print(’нет ключа’) • else. . . 2/17/2018 27

Поиск элемента с минимальным (максимальным) ключом 1 0 6 2 5 min k 1 Поиск элемента с минимальным (максимальным) ключом 1 0 6 2 5 min k 1 8 7 2/17/2018 2 0 max k 3 0 2 1 28

Методы поиска элемента с минимальным (максимальным) ключом • Function TBtr. Mink: TInf; • begin Методы поиска элемента с минимальным (максимальным) ключом • Function TBtr. Mink: TInf; • begin p: =proot; • While p^. A 1<>Nil do p: =p^. A 1; • Result: =p^. Inf; • end; • Function TBtr. Maxk: TInf; • begin p: =proot; • While p^. A 2<>Nil do p: =p^. A 2; • Result: =p^. Inf; • end; 2/17/2018 29

Добавить новый элемент в дерево не нарушая его структуру Добавить 7 7<10 1 0 Добавить новый элемент в дерево не нарушая его структуру Добавить 7 7<10 1 0 7>6 6 2 5 7<8 1 8 7 2 0 3 0 2 1 Новый элемент всегда будет листом! 2/17/2018 30

Метод Add(inf) (начало) • Procedure TBtr. Add(Inf: TInf); • Var bl: Boolean; • begin Метод Add(inf) (начало) • Procedure TBtr. Add(Inf: TInf); • Var bl: Boolean; • begin • New(w); // создание нового листа: • w^. Inf: =Inf; • w^. A 1: =Nil; • w^. A 2: =Nil; • if proot=Nil then proot: =w • else • begin • • // добавление листа… 2/17/2018 31

Метод Add(inf) (конец) • // Поиск места для добавления листа… • p: =proot; • Метод Add(inf) (конец) • // Поиск места для добавления листа… • p: =proot; • repeat • q: =p; // q - указатель на предыдущий элемент • bl: =Inf. key

Пересылка элементов из произвольного массива в дерева Ø Пусть имеется некоторый массив из n Пересылка элементов из произвольного массива в дерева Ø Пусть имеется некоторый массив из n значений данных с разными ключами • type Tms=array[1. . nr] of Tinf; • • Procedure TBtr. Make(a: Tms; n: word); begin For i: =1 to n do Add(a[i]); end; Ø При случайном чередовании ключей в массиве а метод Make обычно формирует дерево неплохо сбалансированное. Ø Однако, если массив а частично упорядочен, то получается плохо сбалансированное дерево 2/17/2018 33

Примеры деревьев получаемых Make 5372468 12437 1 5 2 4 3 2/17/2018 7 3 Примеры деревьев получаемых Make 5372468 12437 1 5 2 4 3 2/17/2018 7 3 2 4 7 8 7 34

Распечатать массив в порядке возрастания (убывания) ключа • tr. Make(a: Tms; n: word); • Распечатать массив в порядке возрастания (убывания) ключа • tr. Make(a: Tms; n: word); • tr. Wrt 1; • tr. Wrt 2; • Если в методе Wrt 1 вместо печати записывать очередной элемент в массив то получаем метод сортировки. Массив желательно организовать динамический. 2/17/2018 35

Построение сбалансированного дерева поиска (вариант 1) • • • • Procedure TBtr. BLns 1(a: Построение сбалансированного дерева поиска (вариант 1) • • • • Procedure TBtr. BLns 1(a: Tms; n: word); Procedure BL(i, j: Word); Var m: Word; begin if i<=j then begin m: =i+j div 2; Add(a[m]); BL(i, m-1); BL(m+1, j); end; begin BL(1, n); end; 2/17/2018 36

Построение сбалансированного дерева поиска (вариант 2) • • • • Procedure TBtr. BLns 2(a: Построение сбалансированного дерева поиска (вариант 2) • • • • Procedure TBtr. BLns 2(a: Tms; n: word); Function BL(i, j: Word): Ttree; Var p: Ttree; m: Word; begin if i>j then p: =Nil else begin m: =i+j div 2; New(p); p^. inf: =a[m]; p^. A 1: =BL(i, m-1); p^. A 2: =BL(m+1, j); end; result: =p; end; begin proot: =BL(1, n); end; 2/17/2018 37

Пример а= 1 2 3 4 5 6 7 8 9 5 7 2 Пример а= 1 2 3 4 5 6 7 8 9 5 7 2 1 3 6 4 2/17/2018 8 9 38

Удаление узла с заданным ключом Ø Узел= лист q 5 p key=4 8 4 Удаление узла с заданным ключом Ø Узел= лист q 5 p key=4 8 4 N 2/17/2018 5 N 8 N 39

Удаление узла с заданным ключом Ø Узел имеет одну дочь q 5 p key=3 Удаление узла с заданным ключом Ø Узел имеет одну дочь q 5 p key=3 8 3 N 2/17/2018 5 4 8 4 40

Удаление узла, имеющего двух дочерей 18 key=12 q 18 p 12 4 8 14 Удаление узла, имеющего двух дочерей 18 key=12 q 18 p 12 4 8 14 4 v 2 6 5 7 2/17/2018 13 16 2 14 6 13 16 w 8 5 7 N W – элемент с максимальным ключом в левом поддереве 41

Ø Удаление узла, имеющего двух дочерей значительно сложнее. Ø Если p – исключаемый узел, Ø Удаление узла, имеющего двух дочерей значительно сложнее. Ø Если p – исключаемый узел, то его следует заменить узлом w, который содержит наибольший ключ в левом поддереве p (либо наименьший ключ в правом поддереве). Ø Такой узел w является либо листом, либо самым правым узлом поддерева p у которого имеется только левая дочь 2/17/2018 42

Метод удаления Delk(k) поиск ключа • Procedure Tree. Delk(k: Tkey); • begin • p: Метод удаления Delk(k) поиск ключа • Procedure Tree. Delk(k: Tkey); • begin • p: =proot; • While (p<>Nil) and (p^. Inf. key<>k) do • begin • q: =p; • if p^. Inf. key>k then p: =p^. A 1 • else p: =p^. A 2; • end; • if p<>Nil then • //исключение найденного узла p: 2/17/2018 43

q 4 • Метод удаления Delk(k) узел=лист q p p=proot 2/17/2018 8 4 N q 4 • Метод удаления Delk(k) узел=лист q p p=proot 2/17/2018 8 4 N begin • if p=proot then • begin new(q); q^. A 1: =p end; • • 5 N if (P^. A 1=Nil) and (P^. A 2=Nil) then if q^. A 1=P then q^. A 1: =Nil // p - лист else q^. A 2: =Nil // случай 1 else 44

q Метод удаления Delk(k) узел имеет одну дочь 5 p 8 3 N • q Метод удаления Delk(k) узел имеет одну дочь 5 p 8 3 N • if P^. A 1=Nil then • if q^. A 1=P then • else • 2/17/2018 else 4 // дочь справа q^. A 1: =p^. A 2 q^. A 2: =p^. A 2 // дочь слева q^. A 1: =p^. A 1 q^. A 2: =p^. A 1 //две дочери: 45

Delk(k) узел имеет две дочери 1 5 key=7 v 7 p 4 w • Delk(k) узел имеет две дочери 1 5 key=7 v 7 p 4 w • begin 2 6 8 • w: =p^. A 1; • if w^. A 2=Nil then w^. A 2: =p^. A 2 5 N • else begin • Repeat v=w; w: =w^. A 2; • until w^. A 2=Nil; • v^. A 2: =w^. A 1; //5 6 • w^. A 1: =p^. A 1; //6 7 • w^. A 2: =p^. A 2; • end; • if q^. A 1=P then q^. A 1: =w • else q^. A 2: =w; • end; 2/17/2018 q 9 10 46

Delk(k) ключ находится в корне q key=7 7 4 • • p=proot 9 if Delk(k) ключ находится в корне q key=7 7 4 • • p=proot 9 if p=proot then begin proot: =q^. A 1; dispose(q) end; Dispose(p); // исключения узла p end; // Delk 2/17/2018 47

Контрольные вопросы Ø Дайте определение основным понятиям древовидной структуры – корень, узел, лист, порядок Контрольные вопросы Ø Дайте определение основным понятиям древовидной структуры – корень, узел, лист, порядок узла, порядок дерева, глубина листа, глубина дерева, определение сбалансированного дерева. Ø Напишите рекурсивный тип, используемый для работы с деревом данных и поясните как формируется дерево. Ø Напишите процедуры обхода дерева в прямом и обратном порядке и проиллюстрируйте результат обхода дерева на рис. 7. 1. Ø Дайте определение бинарного дерева поиска и опишите его особенности. Ø По заданному отсортированному массиву нарисуйте сбалансированное дерево поиска. Ø Напишите методы симметричного обхода бинарного дерева, поиска элемента с заданным ключом, вставки нового элемента, удаления элемента с заданным ключом. 2/17/2018 48

Задачи на экзамен Ø Ø № 13 Ввести массив записей со случайным распределением ключей Задачи на экзамен Ø Ø № 13 Ввести массив записей со случайным распределением ключей {a[i]: TInf} (Inf. F - фамилия; Inf. к - учетный номер) из String. Grid 1 в двоичное дерево поиска методом Add после чего прочитать его в String. Grid 2 методом Wrt 1. Методы класса Add и Wrt 1 оформить в отдельном модуле. 2/17/2018 49

Задачи на экзамен Ø № 14 Ø Ø Ø Ввести массив записей со случайным Задачи на экзамен Ø № 14 Ø Ø Ø Ввести массив записей со случайным распределением ключей {a[i]. Inf} (Inf. F - фамилия; Inf. к - учетный номер) из String. Grid 1 в двоичное дерево поиска процедурой Add, после чего найти в дереве поиска и распечатать в Memo 1 запись с ключом k, введенным из Edit 1. Методы класса Add и Poisk оформить в отдельном модуле. 2/17/2018 50

Задачи на экзамен Ø № 15 Ø Ø Ø Ввести массив записей с упорядоченным Задачи на экзамен Ø № 15 Ø Ø Ø Ввести массив записей с упорядоченным распределением ключей {a[i]: TInf } (Inf. F - фамилия; Inf. к - учетный номер) из String. Grid 1 в двоичное идеально сбалансированное дерево с помощью метода Blns. После чего найти в дереве поиска с помощью функии Mink и распечатать в Memo 1 запись с минимальным ключом. Методы класса Blns , Mink оформить в отдельном модуле. 2/17/2018 51