
- •Тема 7 Древовидные структуры данных
- •Понятие древовидной структуры данных
- •Древовидное размещение списка данных
- •Основные определения
- •Для реализации древовидных структур данных степени m используется уже знакомая нам следующая конструкция
- •Пример прямого размещения данных
- •После того как дерево заполнено информацией, его нужно уметь просмотреть, распечатать, осуществить поиск.
- •Обходом дерева называется последовательное обращение ко всем его узлам.
- •Прямой обход
- •Обратный обход
- •• Var proot,p:Ptree; //
- •Поиск при обходе
- •Удаление дерева из памяти
- •Бинарное дерево поиска
- •Ввиду своеобразной организации эффективность поиска информации в такой динамической структуре данных сравнима
- •Сбалансированное и несбалансированное деревья
- •Основные операции с бинарным деревом поиска
- •Класс для работы с деревом
- •Работа с деревом
- •Создать дерево
- •Удалить дерево
- •Симметричный обход слева направо
- •Симметричный обход слева направо
- •Симметричный обход справа налево
- •Поиск ключа не требует рекурсии
- •Метод poisk(k)
- •Поиск элемента с минимальным (максимальным) ключом
- •Методы поиска элемента с минимальным (максимальным) ключом
- •Добавить новый элемент в дерево не нарушая его структуру
- •Метод Add(inf) (начало)
- •Метод Add(inf) (конец)
- •Пересылка элементов из произвольного массива в дерево
- •Примеры деревьев получаемых Make
- •Распечатать массив в порядке возрастания (убывания) ключа
- •Построение сбалансированного дерева поиска
- •Построение сбалансированного дерева поиска
- •Удаление узла с заданным ключом
- •Удаление узла с заданным ключом
- •Удаление узла, имеющего двух дочерей
- •Удаление узла, имеющего двух дочерей
- •Метод удаления Delk(k) поиск ключа
- •Метод удаления Delk(k) узел имеет одну дочь
- •Delk(k)
- •Delk(k)
- •Контрольные вопросы
- •Задачи на экзамен
- •Задачи на экзамен
- •Задачи на экзамен
Удалить дерево
•Destructor TBtr.Free;
•Procedure Del(var p:Ttree);
• |
begin |
• |
If (p<>Nil) then begin |
• |
Del(p^.A1); |
• |
Del(p^.A2); |
• |
Dispose(p); |
• |
p:=Nil; |
• |
end; |
• |
end; |
•Begin
•Del(proot); inherited free;
•end;
07/02/19 |
21 |
Симметричный обход слева направо
• Procedure TBtr.Wrt1;
• |
Procedure Wr(p:Ttree); |
• |
begin |
• |
if p<>nil then |
• |
begin |
• |
Wr(p^.A1); |
• |
Print(p^.Inf); |
• |
Wr(p^.A2); |
• |
end; |
• |
end; |
• |
begin |
• |
p:=proot; wr(p) |
•end;
07/02/19 |
22 |

Симметричный обход слева направо
1
0
|
6 |
|
2 |
|
|
|
5 |
1 |
8 |
2 |
3 |
|
|
0 |
0 |
|
|
|
2 |
|
|
|
1 |
1 6 8 10 20 21 25 30
07/02/19 |
23 |
|
Симметричный обход справа налево |
• Procedure TBtr.Wrt2; |
|
• |
Procedure Wr(p:Ttree); |
• |
begin |
• |
if p<>nil then |
• |
begin |
• |
Wr(p^.A2); |
• |
Print(p^.Inf); |
• |
Wr(p^.A1); |
• |
end; |
• |
end; |
•begin
•p:=proot; wr(p)
•end;
07/02/19 |
24 |

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

Поиск ключа не требует рекурсии
|
|
20>10 |
|
|
|
1 |
20<25 |
|
|
0 |
|
|
|
|
|
|
6 |
|
2 |
|
|
|
5 |
1 |
8 |
2 |
3 |
|
|
0 |
0 |
|
|
|
2 |
|
|
|
1 |
Найти
20
Затраты на поиск пропорциональны глубине дерева
О(log2n).
07/02/19 |
26 |
Метод 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 k<p^.Inf.key |
then p:=p^.A1 |
• |
else p:=p^.A2; |
|
•if p<>Nil then Result:=p^.inf
• |
else Result.key:=nok; |
•end;
•Обращение к методу
•Inf:=tr.poisk(k);
•If inf.key=nok then print(’нет ключа’)
• |
else . . . |
07/02/19 |
27 |

Поиск элемента с минимальным (максимальным) ключом
1
0
|
6 |
|
2 |
|
min k |
|
|
5 |
max k |
1 |
8 |
2 |
|
3 |
|
|
0 |
|
0 |
|
7 |
|
2 |
|
|
|
|
1 |
|
07/02/19 |
28 |
Методы поиска элемента с минимальным (максимальным) ключом
•Function TBtr.Mink:TInf;
•begin p:=proot;
• |
While p^.A1<>Nil do p:=p^.A1; |
• |
Result:=p^.Inf; |
•end;
•Function TBtr.Maxk:TInf;
•begin p:=proot;
• |
While p^.A2<>Nil do p:=p^.A2; |
• |
Result:=p^.Inf; |
•end;
07/02/19 |
29 |

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