Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1337.docx
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
211.4 Кб
Скачать

58. Деревья

Дерево - одна из наиболее распространённых структур данных, используемых в программировании.
Формально дерево определяется следующим образом: это конечное множество Т, состоящее из одного или более узлов таких, что выполняется следующие условия:

  • 1)  имеется один узел, называемый корнем дерева

  • 2)  остальные узлы, исключая корень, содержатся в m>0 попарно непересекающихся 
множеств Т1, Т2,....Тm, каждое из которых в свою очередь является деревом. При этом 
деревья Т1, Т2,....Тm называются поддеревьями данного корня.

Обход дерева- это последовательные обход всех узлов дерева. Существует три способа обхода:

  • 1)  обход с префиксным порядком

  • 2)  обход с инфиксным порядком

  • 3)  обход с суффиксным порядком

Например дано дерево: (A*B+C*D)/(B*C)

/ +*

BC **

ABCD

Префиксный порядок обхода дерева определяется в виде списка узлов следующим образом: если дерево не пусто, то префиксный порядок это

  • 1)  кореньдерева

  • 2)  узлы левого поддерева в префиксном порядке

  • 3)  узлы правого поддерева в префиксном порядке

/+*AB*CD*BC

Инфиксный порядок обхода дерева определяется в виде списка узлов следующим образом: если дерево не пусто, то инфиксный порядок это

  • 1)  узлы левого поддерева в инфиксном порядке

  • 2)  кореньдерева

  • 3)  узлы правого поддерева в инфиксном порядке

A*B+C*D/B*C

Суффиксный порядок обхода дерева определяется в виде списка узлов следующим образом: если дерево не пусто, то инфиксный порядок это

  • 1)  узлы левого поддерева в суффиксном порядке

  • 2)  узлы правого поддерева в суффиксном порядке

  • 3)  кореньдерева

AB*CD*+BC*/

197

Отображение деревьев любого вида при помощи бинарных.

Бинарное дерево- это дерево, для каждого узла которого имеется всего два поддерева. Для отображения любого дерева с помощью бинарного в таком бинарном дереве для каждого узла правое поддерево указывает на список узлов, являющиеся дочерними для данного, левое поддерево указывает на список узлов этого же уровня иерархии для данного дерева.

Сравнение поддеревьев.
Процедуру сравнения поддеревьев рассмотрим на примере бинарного дерева. Для описания структуры дерева введём следующие типы:
type

tree=^node; node=record inf:char;

lint,rint: tree; end;

Сравнение деревьев будем производить путём сравнения информационной части дерева (сравниваться будет поле inf).
Напишем функцию, которая будет выдавать истинное значение, если два дерева равны, и ложное значение в противном случае. Эта функция должна сравнивать информационные части узлов дерева, а далее рекурсивно сравнивать левые и правые поддеревья. Фактически функция осуществляет обход дерева сверху вниз.

function TreeEqual(p1,p2:tree):boolean; begin

if p1=p2 then TreeEqual:=true
else if (p2<>NIL) and (p1<>Nil) then TreeEqual:=(p1^.inf=p2^.inf) and TreeEqual(p1^.lint,p2^.lint) and

TreeEqual(p1^.rint,p2^.rint) end;