
- •Динамические структуры данных:
- •Основные понятия
- •Основные понятия
- •Основные понятия
- •Основные понятия
- •Бинарные
- •Бинарное дерево
- •Двоичные деревья
- •Двоичные деревья
- •Описание двоичного дерева
- •Бинарное дерево
- •Обход бинарного дерева
- •Обход бинарного дерева
- •Обход бинарного дерева
- •Обход бинарного дерева
- •Обход бинарного дерева
- •Обход бинарного дерева
- •Обход бинарного дерева
- •Бинарное дерево
- •Основными операциями с
- •Виды бинарных
- •Идеально сбалансированные
- •Правило построения
- ••Uses Crt;
- ••Procedure PrintTree (t:ref; h:integer);
- ••Begin
- •Дерево поиска
- •Типовые операции над деревьями поиска:
- •Включение в дерево
- •Поиск по дереву
- •Поиск по дереву с включением
- •Включение в дерево
- •Обход дерева
- •Обход дерева
- ••Begin
- •Удаление из дерева
- •Удаление узла, не имеющего потомков
- •Удаление узла с двумя потомками
- •Правило удаления
- •Удаление узлов (общий случай) 13 15 10
- ••Procedure Delet (x:integer; Var p:ref);
- ••Begin

Типовые операции над деревьями поиска:
•добавление элемента в дерево;
•удаление элемента из дерева;
•обход дерева (для печати элементов и т.д.);
•поиск в дереве (элемента с заданным ключом).
Поскольку определение двоичного дерева рекурсивно, то все указанные типовые операции могут быть реализованы в виде рекурсивных подпрограмм (на практике именно такой вариант
чаще всего и применяется). |
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