Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Conspekt.doc
Скачиваний:
11
Добавлен:
31.08.2019
Размер:
1.39 Mб
Скачать

5.18 Бинарные деревья

Бинарное дерево определяется рекурсивно как имеющее левое поддерево, корень и правое поддерево. Левое и правое подде-ревья сами являются бинарными деревьями.

nil - пустое поддерево

а

/ \

b e

/ \ / \

c d

/ \ / \

Бинарное дерево представляется термом:

tree(L, K, R).

tree(tree(nil,c,nil),b,tree(nil,d,nil)) - так можно опи-

сать левое под-

дерево.

tree( tree( tree(nil,c,nil), b, tree(nil,d,nil) ),

a,

tree(nil,e,nil) )

Представление множеств в виде списков при большом числе элементов приводит к тому, что списковые целевые утверждения становятся неэффективными. Представление же множеств бинарными деревьями позволяет добиться лучших результатов. При этом бинарное дерево должно быть упорядочено. В этом случае вершины, находящиеся левее корня - < корня, а правее - > корня.

Упорядоченное дерево Неупорядоченное дерево

( сбалансированное )

d a

/ \ / \

b e b e

/ \ / \

a c c d

Дерево м. упорядочить различными способами:

Линейное дерево.

a ---- b ----- c ----- d ----- e -----

¦ ¦ ¦ ¦ ¦

В линейном дереве поиск идет медленнее, чем в сбалансированном, т.к. здесь имеет место обычный перебор.

Естественно, что наша цель - осуществить поиск в сбалансированном дереве. Но задача построения таких деревьев сложна сама по себе (см. Верт "Построение бинарных деревьев").

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

Определим предикат

принадлежит(X,T) - истинно, если X принадлежит дереву Т

принадлежит(X,T) = true ,

если X-корень дерева Т;

если X<Кор ,то X принадлежит левому поддереву(L);

если X>Кор ,то X принадлежит правому поддереву(R);

принадлежит(X, tree(L,X,R)).

принадлежит(X, tree(L,K,R)):-

more(K,X), принадлежит(X, L).

принадлежит(X, tree(L,K,R)):-

more(X,K), принадлежит(X, R).

Т.о. видим, что каждый раз отсекается половина дерева, что является эффективным.

Дерево, состоящее из 1024 вершины :

линейный поиск - 512 вариантов.

поиск по бинарному дереву - 10 вариантов.

5.18.1 Построение бинарного дерева

Задача создания бинарного дерева путем добавления элемента Х к существующему бинарному дереву формулируется с.о.:

add(T,X,T1) - где T - исходное дерево

X - добавляемый элемент

T1 - новое дерево

Если Т=nil, то X-корень и T1=tree(nil,X,nil)

T<>nil,то Если X<Корень, то X добавить в Лд

Если X>Корень, то X добавить в Пд

add(nil,X, tree(nil,X,nil) ).

add(tree(L,K,R), X, tree(L1,K,R) ):-

more(K,X), add(L,X,L1).

add(tree(L,K,R), X, tree(L,K,R1) ):-

more(X,K), add(R,X,R1).

?- add(nil,a,T1), % T1 = tree(nil,a,nil)

add(T1,b,T2), % a>b? Да:

% T2 = tree( tree(nil,a,nil),b,nil )

add(T2,c,T3). % T3 = tree( tree( tree(nil,a,nil), b,

% nil), c,nil).

Мы получили упорядоченное линейное дерево. Чтобы дерево было нелинейным достаточно вводить вершины в другом порядке.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]