Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / Struktury.docx
Скачиваний:
37
Добавлен:
04.04.2018
Размер:
2.84 Mб
Скачать

Включение элементов в сбалансированное дерева.

Пусть включение L приведет к увеличение на единицу его высоты. Пусть была такая позиция

R L,R

1) HL=Hk->hL>hr но дерево остается сбалансированным

2) HL<Hr-> HL=HR

3) hL>hR -> критерии сбалансированности нарушается. Дерево необходимо перестраивать

Существуют две различные ситуации, требующие подхода. Остальные мб выведены из двух на основе симметрии.

1) B A

A B

1 Случай

Пр.

8 4

4 10 2 8

2 6 1 6 10

1

2) С В

А А С

В

2 Случай

Алгоритм включения и сбалансированности зависит от организации дерева. Можно хранить показатель сбалансированности каждой вершине.

Type ptr=^Node; Balance=-1..+1 Node=record key:integer; count:word; left,right:ptr; bal:balance; end;

Показатель сбалансированности будем интерпретировать(показывать) как разность между высотой R и L.

Процесс включения вершины состоит из 3х частей.

  1. Проход по пути поиска (пока не убедимся, что ключа в дереве нет)

  2. Включение новой вершины в определенную точку и определяем результирующий показатель сбалансированности.

  3. Отступление по пути поиска (назад с проверкой) и проверка в каждой вершине показателя сбалансирования, если надо, то балансировка.

За основу возьмем процедуру search для бинарного дерева. Добавляем в нее нужные действия и в параметре включаем показатель баланса типа Boolean. h указывает, что высота дерева увеличилась. Перед включением мы в поддереве должны различать ситуации.

  1. HL<HR p^.bal=+1

Тогда предыдущая несбалансированность уравновешивается.

  1. HL=HR

P^bal=0

Тогда левое поддерево перевесит.

  1. HL<HR p^.bal=-1

Необходима балансировка. Если левое поддерево выше правого, то случай баланса 1, иначе случай 2.

Пр. Рассмотрим дерево, содержащая 2 вершины.

4 5

5 простой RR поворот 4 7

7 2

1 (баланс нарушен)

5

2 7 4

1 4 сложный LR повотор 2 5

3 1 3 7

6

4

2 6 RL

1 3 5 7

(4) блок схема включения АВЛ дерева

Procedure Search (x:integer; var p:ptr; var h:Boolean); var p1,p2:ptr;

P=nil

Getmem(p,sizeof(node)) h=true p^.key=x; p^.count=1; p^.left=nil; p^.right=nil; p^.bal=0;

P^.key>x

Search(x,p^.left);

H=true

- +

баланс

P^.bal=1

P^.bal=0

P^.bal=-1

+ + +

P^.bal=0 h=false

P^.bal=-1

P1=p^.left

м

P1.bal=-1

{LR}

P2=p1.^right p1^.right=p2^.left p2^.left=p1 p^.left=p2^.right p2^.right=p

P^.left=p1^.right p1^.right=p; p^.bal=0 p=p1

{LL}

P2^.bal=-1

P^.bal=0 h=false

= - {конец case}

P^.bal=1

P^.bal=0

P2^.bal=+1

P1^.bal=0

P1^.bal=-1

P=p2

B

P^.key<x

-

P^.count=p^.count+1

+

End search

Search(x,p^.right,h)

С

(правая ветвь)

H=true

+

P^.bal=-1

P^.bal=0

P^.bal=+1

Баланс

P^.bal=0 h=false

P^.bal=1

p1=p^.right

P1^.bal=1

RL

(RR)

p^.right=p1^.left p1^.left=p p1^.bal=0 p=p1

B

P2^.bal=1

P2^.bal=-1

P^.bal=0

P^.bal=0 h=false

{end case} {end then} С

Соседние файлы в папке Лекции