44
2) элемент Х больше значения корня дерева, то искать элемент Х в
правом поддереве;
3) элемент Х меньше значения корня, то искать в левом поддереве.
Рассмотрим процедуру поиска:
find_tree(X, tr(X, _, _)). (1)
find_tree (X, tr(Y, L, _)):– (2)
X < Y,
find_tree(X, L).
find_tree(X, tr(Y, _, R)):– (3)
X > Y,
find_tree(X, R).
Предикат find_tree имеет два объекта: элемент Х и заданное дерево. Если
элемент Х присутствует в дереве, работа данной процедуры будет успешна.
Поиск элемента в дереве окончен, когда дерево будет пустым.
Процедура состоит из факта (1) и двух рекурсивных правил. Факт (1)
отражает присутствие элемента в дереве. Случай, когда элемент Х совпадает с
корнем дерева. Правило (2) – поиск элемента в левом поддереве find_tree(X, L).
Правило (3) – поиск элемента в правом поддереве find_tree (R, L).
Поиск в двоичном справочнике эффективнее, чем поиск в списке. Время
поиска будет пропорционально глубине дерева. Глубина дерева – это длина
самого длинного пути между корнем и листом дерева.
5.5.2.Добавление нового элемента в дерево
Добавление нового элемента в дерево в качестве листа
Самый простой способ добавить новый элемент на самый нижний уровень
дерева в качестве листа. Место, куда помещается новый элемент, выбрать таким
образом, чтобы не нарушить упорядоченность дерева. Двоичное упорядоченное
дерево не должно содержать одинаковые элементы.
Рассмотрим процедуру добавления нового элемента в качестве листа.
add_leaf(empty, X, tr(X, empty, empty)). (1)
add_leaf(tr(X, L, R), X, tr(X, L, R)). (2)
add_leaf(tr(Y, L, R), X, tr(Y, L1, R)):– (3)
X < Y,
add_leaf(L, X, L1).
add_leaf(tr(Y, L, R), X, tr(Y, L, R1)):– (4)
X > Y,
add_leaf(R, X, R1).
Предикат add_leaf имеет три объекта:
первый объект -- входное дерево;
второй объект – элемент, добавляемый в дерево (Х);
третий объект – выходное дерево.