
- •Тема 7 Древовидные структуры данных
- •Понятие древовидной структуры данных
- •Древовидное размещение списка данных
- •Основные определения
- •Для реализации древовидных структур данных степени m используется уже знакомая нам следующая конструкция
- •Пример прямого размещения данных
- •После того как дерево заполнено информацией, его нужно уметь просмотреть, распечатать, осуществить поиск.
- •Обходом дерева называется последовательное обращение ко всем его узлам.
- •Прямой обход
- •Обратный обход
- •• Var proot,p:Ptree; //
- •Поиск при обходе
- •Удаление дерева из памяти
- •Бинарное дерево поиска
- •Ввиду своеобразной организации эффективность поиска информации в такой динамической структуре данных сравнима
- •Сбалансированное и несбалансированное деревья
- •Основные операции с бинарным деревом поиска
- •Класс для работы с деревом
- •Работа с деревом
- •Создать дерево
- •Удалить дерево
- •Симметричный обход слева направо
- •Симметричный обход слева направо
- •Симметричный обход справа налево
- •Поиск ключа не требует рекурсии
- •Метод poisk(k)
- •Поиск элемента с минимальным (максимальным) ключом
- •Методы поиска элемента с минимальным (максимальным) ключом
- •Добавить новый элемент в дерево не нарушая его структуру
- •Метод Add(inf) (начало)
- •Метод Add(inf) (конец)
- •Пересылка элементов из произвольного массива в дерево
- •Примеры деревьев получаемых Make
- •Распечатать массив в порядке возрастания (убывания) ключа
- •Построение сбалансированного дерева поиска
- •Построение сбалансированного дерева поиска
- •Удаление узла с заданным ключом
- •Удаление узла с заданным ключом
- •Удаление узла, имеющего двух дочерей
- •Удаление узла, имеющего двух дочерей
- •Метод удаления Delk(k) поиск ключа
- •Метод удаления Delk(k) узел имеет одну дочь
- •Delk(k)
- •Delk(k)
- •Контрольные вопросы
- •Задачи на экзамен
- •Задачи на экзамен
- •Задачи на экзамен

Удаление узла, имеющего двух дочерей
|
|
|
1 |
q |
|
|
18 |
|
|
|
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
key=12 12 |
p |
|
|
|
8 |
|
|
|
|
|
|
|
|
|
|
4 |
|
14 |
|
4 |
|
14 |
|
v |
|
|
|
|
||
|
|
|
|
|
|
|
|
2 |
6 |
13 |
16 |
2 |
6 |
13 |
16 |
|
|
|
|
w
5 8
5 7
7 N
W – элемент с максимальным ключом в левом поддереве |
41 |
07/02/19 |
Удаление узла, имеющего двух дочерей
значительно сложнее.
Если p – исключаемый узел, то его следует заменить узлом w, который содержит наибольший ключ в левом поддереве p (либо наименьший ключ в правом поддереве).
Такой узел w является либо листом, либо самым правым узлом поддерева p у которого имеется только левая дочь
07/02/19 |
42 |
Метод удаления 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^.A1 |
• |
else p:=p^.A2; |
• |
end; |
•if p<>Nil then
• |
//исключение найденного узла p: |
07/02/19 |
43 |

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

Метод удаления Delk(k) узел имеет одну дочь
q
5
p 3 8
N4
• if P^.A1=Nil then |
// дочь справа |
||
• |
if q^.A1=P then q^.A1:=p^.A2 |
||
• |
|
else q^.A2:=p^.A2 |
|
• |
else |
// дочь слева |
|
• |
if q^.A1=P then q^.A1:=p^.A1 |
||
• |
else q^.A2:=p^.A1 |
||
• |
else |
//две дочери: |
07/02/19 |
45 |

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

Delk(k)
ключ находится в корне
•if p=proot then
• begin
• proot:=q^.A1;
• dispose(q)
• end;
q key=7 7 p=proot
4 9
•Dispose(p); // исключения узла p
•end;
• end; // Delk
07/02/19 |
47 |
Контрольные вопросы
Дайте определение основным понятиям древовидной структуры
– корень, узел, лист, порядок узла, порядок дерева, глубина листа, глубина дерева, определение сбалансированного дерева.
Напишите рекурсивный тип, используемый для работы с деревом данных и поясните как формируется дерево.
Напишите процедуры обхода дерева в прямом и обратном порядке и проиллюстрируйте результат обхода дерева на рис.7.1.
Дайте определение бинарного дерева поиска и опишите его особенности.
По заданному отсортированному массиву нарисуйте сбалансированное дерево поиска.
Напишите методы симметричного обхода бинарного дерева, поиска элемента с заданным ключом, вставки нового элемента, удаления элемента с заданным ключом.
07/02/19 |
48 |
Задачи на экзамен
№13
Ввести массив записей со случайным распределением ключей {a[i]:TInf} (Inf.F - фамилия; Inf.к - учетный номер) из StringGrid1 в двоичное дерево поиска методом Add
после чего прочитать его в StringGrid2 методом
Wrt1.
Методы класса Add и Wrt1 оформить в отдельном модуле.
07/02/19 |
49 |
Задачи на экзамен
№14
Ввести массив записей со случайным распределением ключей {a[i].Inf} (Inf.F - фамилия; Inf.к - учетный номер) из StringGrid1 в двоичное дерево поиска процедурой Add,
после чего найти в дереве поиска и распечатать в Memo1 запись с ключом k, введенным из Edit1.
Методы класса Add и Poisk оформить в отдельном модуле.
07/02/19 |
50 |