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

Шумихин / Шумихин / Шумихин - лекция 13

.txt
Скачиваний:
7
Добавлен:
20.05.2015
Размер:
2.58 Кб
Скачать
ЛЕКЦИЯ 13, что символизирует
30.11.12

Начало красного террора.
50 минут тролления ФИТа.
To be continued.

Рекурсивные структуры данных в Прологе

Деревья

domains
treetp = tree(string, treetp, treetp); empty.

tree -- придуманное, можно вместо него писать всё что угодно
аргументы: тип узла, типы поддеревьев

a
/ \
b c
/ / \
d e f
tree(a, tree(b, tree(d, empty, empty), tree(c, tree(e, empty, empty), tree(f, empty, empty)))

Обход дерева

Почти все обходы имеют такую структуру:
traverse(empty).
traverse(tree(A, L, R)) :- обработка(A), traverse(L), traverse(R).

ПРИМЕРЫ
1. Найти сумму всех узлов дерева.

sum(empty, 0) :- !.
sum(tree(A, L, R), S) :- sum(L, S1), sum(R, S2), S=A+S1+S2.
_____________________

Под деревом мы будем понимать бинарное дерево.
Пока деревья неупорядоченные.
В графе и в дереве вершины иногда подразделяют на главную и подчинённую (или "отец и сын").
Любая вершина имеет отца, кроме корневой.
Лист дерева -- это вершина, которая не имеет поддеревьев.
Крона дерева -- это совокупность всех листов.
Высота дерева -- наибольший путь от корня к листу.

Про бинарные деревья в следующий раз.

ПРИМЕРЫ
1. Написать предикат, который определяет принадлежность элемента дереву.

contains(C, tree(C, L, R)) :- !.
contains(C, tree(_, L, _)) :- contains(C, L), !.
contains(C, tree(_, _, R)) :- contains(C, R).

Самостоятельное: написать программу, которая распечатывает все узлы дерева, порядок значения не имеет.
Оттестировать эту программу на дереве, которое было сегодня в аудитории.
__________________________________