Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Презентации 2часть / Лекция_28_29_Древовидные структуры.ppt
Скачиваний:
23
Добавлен:
11.05.2015
Размер:
257.54 Кб
Скачать

Удаление узла, имеющего двух дочерей

 

 

 

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