Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
47
Добавлен:
12.05.2015
Размер:
607.74 Кб
Скачать

Типовые операции над деревьями поиска:

добавление элемента в дерево;

удаление элемента из дерева;

обход дерева (для печати элементов и т.д.);

поиск в дереве (элемента с заданным ключом).

Поскольку определение двоичного дерева рекурсивно, то все указанные типовые операции могут быть реализованы в виде рекурсивных подпрограмм (на практике именно такой вариант

чаще всего и применяется).

31

Включение в дерево

procedure insert(var root : pnode; key : word); var p, parent : pnode;

begin

if find(root, key, p, parent) then begin writeln(' такой элемент уже есть'); exit; end;

new(p);

{ создание нового элемента }

p^.data := key;

p^.left

:= nil;

p^.right := nil;

if root = nil then root := p { первый элемент } else { присоед-е нового элемента к дереву} if key < parent^.data

then parent^.left := p else parent^.right := p;

end;

32

Поиск по дереву

function find(root : pnode; key : word; var p, parent : pnode) : boolean;

begin

 

 

p := root;

{ поиск начинается от корня }

while p <> nil do begin

 

if key = p^.data then

{ такой узел есть }

begin find := true; exit end;

parent := p;

{ запомнить ук-ль перед спуском }

if key < p^.data

 

then p := p^.left

{ спуститься влево }

else p := p^.right;

{ спуститься вправо }

end;

 

 

find := false; end;

33

Поиск по дереву с включением

Type

ref = ^Wword;

Wword = Record

key : integer;

count : integer;

left, right : ref;

End;

Var

root : ref;

k : integer;

34

Включение в дерево

Procedure Search (x:integer; Var p :ref);

Begin

If p=Nil Then

Begin {слова нет в дереве включить его}

New(p);

With p^ Do

Begin

key:=x;

count:=1;

left:=Nil;

right:=Nil

End

End

Else

If x<p^.key Then Search(x, p^.left)

 

Else If x>p^.key Then Search(x, p^.right)

 

Else p^.count:= p^.count +1

 

End ;{Search}

35

 

 

Обход дерева

procedure print_tree( дерево ); begin

print_tree( левое_поддерево ) посещение корня

print_tree( правое_поддерево ) end;

36

Обход дерева

Procedure PrintTree (w:ref; l:integer);

Var

i : integer;

Begin

If w<>Nil Then

With w^ Do

Begin

PrintTree (right, l+1);

For i:=1 To l Do Write (‘ ‘);

Writeln (key);

PrintTree (left,l+1);

End

End;

37

Begin

ClrScr;

root:=Nil;

Writeln (‘Введіть ключі’);

Repeat

Read(k);

Search(k,root);

Until k=0;

Writeln(‘ Дерево пошуку’);

PrintTree (root,0);

Repeat Until KeyPressed

End.

38

Удаление из дерева

1.Найти узел, который будет поставлен на место удаляемого.

2.Реорганизовать дерево так, чтобы не нарушились его свойства.

3.Присоединить новый узел к узлу- предку удаляемого узла.

4.Освободить память из-под удаляемого узла.

39

Удаление узла, не имеющего потомков

… …

p

Удаление узла с одним потомком

… …

p

y

40

Соседние файлы в папке Алгоритмы и структуры данных