
- •3.Жизненный цикл программы. Критерии качества программы.
- •5.Разработка проекта программной системы
- •6.Схемы алгоритмов, данных, программ
- •7.Символы данных. 8.Символы процесса. Все это говно не копируется со схемам, 9.Символы линий.
- •13.Алфавит языка Паскаль.
- •14.Грамматика для описания языка, синтаксические диаграммы
- •15.Структура программы на языке Паскаль
- •18.Стандартные типы данных
- •19.Порядковые типы данных
- •20.Данные логического типа(булевского)
- •21.Данные целого типа
- •22.Данные символьного типа
- •29.Строки
- •50. Проектирование модульных программ. Модуляризация
- •51. Связность модуля
- •53. Алгоритмы сортировки массива
- •54. Алгоритмы поиска
- •55. Динамические структуры данных
- •56. Линейные списки
- •57. Стек, очередь, дек
- •58. Деревья
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;