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

Метод Add(inf) (начало)

Procedure TBtr.Add(Inf:TInf);

Var bl:Boolean;

begin

New(w); // создание нового листа:

w^.Inf:=Inf;

w^.A1:=Nil;

w^.A2:=Nil;

if proot=Nil then proot:=w

else

begin

 

// добавление листа…

07/02/19

31

Метод Add(inf) (конец)

// Поиск места для добавления листа…

p:=proot;

repeat

q:=p; // q - указатель на предыдущий элемент

bl:=Inf.key<p^.Inf.key;

if bl then p:=p^.A1

 

else p:=p^.A2;

 

until p=Nil;

// добавление листа

if bl then q^.A1:=w

else q^.A2:=w;

end;

end;

07/02/19

32

Пересылка элементов из произвольного массива в дерево

Пусть имеется некоторый массив из 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 обычно формирует дерево неплохо сбалансированное.

Однако, если массив а частично упорядочен, то получается плохо

07/02/19

33

сбалансированное дерево

 

Примеры деревьев получаемых Make

1 2 4 3 7

5 3 7 2 4 6 8

 

1

5

2

 

3

 

7

 

 

 

 

 

 

 

4

2

4

7

8

 

37

07/02/19

34

Распечатать массив в порядке возрастания (убывания) ключа

tr.Make(a:Tms;n:word);

tr.Wrt1;

tr.Wrt2;

Если в методе Wrt1 вместо печати записывать

очередной элемент в массив то получаем метод сортировки. Массив желательно организовать динамический.

07/02/19

35

Построение сбалансированного дерева поиска

(вариант 1)

Procedure TBtr.BLns1(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;

end;

begin BL(1,n);

end;

07/02/19

36

Построение сбалансированного дерева поиска

(вариант 2 без make)

Procedure TBtr.BLns2(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^.A1:=BL(i,m-1);

p^.A2:=BL(m+1,j);

end;

result:=p;

end;

begin proot:=BL(1,n);

end;

07/02/19

37

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

5

2

7

 

1

3

6

8

 

 

 

 

4

9

 

07/02/19

38

Удаление узла с заданным ключом

Узел= лист

q

5

5

p

key=4

4

8

N

8

NN

07/02/19

39

Удаление узла с заданным ключом

Узел имеет одну дочь

q

5

5

p

key=3

3

8

4

8

N4

07/02/19

40