Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

While notEOF(F) do

Begin

Var

Begin

Var

Type

Const

Uses

Type

Пример.

Type

Пример.

Type

Const

Пример.

Сильно ветвящиеся деревья

 

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

 

Следует различать несколько подвидов сильноветвящихся деревьев.

 


1. Дерево, каждый узел которого имеет не более чем N потомков (N – постоянное для данного дерева число).

N = 8;

pMyTreeNode = ^MyTreeNode;

MyTreeNode = record

iKey: integer; // Ключевое поле

nKey: integer; // Количество посещений данного узла

mpChild: array [1 .. N] of pMyTreeNode;

npChild: integer; // Текущее количество потомков, <= N

end;

 

Недостаток такой структуры состоит в том, что для некоторых узлов число N намного больше количества реальных потомков (память под узел типа
MyTreeNode расходуется неэкономно), тогда как для других узлов число N недостаточно для указания всех требуемых потомков.

 


2. Дерево, каждый узел которого может иметь произвольное (неограниченное) количество потомков. Ссылки на них хранятся в элементах динамического массива.

pMyTreeNode = ^MyTreeNode;

MyTreeNode = record

iKey: integer;

nKey: integer;

mpChild: array of pMyTreeNode;

end;

 

В записи MyTreeNode массив mpChild представлен лишь указателем на то место оперативной памяти, где располагаются элементы динамического массива. «Разбирательство» с увеличением или уменьшением числа элементов динамического массива ложится на операционную систему. При «переделке» дерева на хранение на дисках программист вынужден сам решать, где ему располагать элементы массива mpChild, что не всегда легко. Разговор об этом позже будет продолжен.

3. Дерево, каждый узел которого может иметь произвольное (неограниченное) количество потомков. Для узлов такого дерева уместно ввести новое отношение «старший брат» – «младший брат». Все потомки узла-предка являются «братьями», с узла-предка имеется ссылка только на одного из них – на «старшего брата». «Братья» (от старшего к младшему) выстроены в виде линейного списка.

pMyTreeNode = ^MyTreeNode;

MyTreeNode = record

iKey: integer;

pChild, pBrother: pMyTreeNode;

end;

 

 

4. Дерево, каждый узел которого ссылается на своих потомков с помощью вспомогательного дерева. Применяется для деревьев очень большой степени, когда даже отношение «предок-потомок» приходится оптимизировать по скорости доступа.


program Project1;

 

{$APPTYPE CONSOLE}

 

{$DEFINE StaticArrayOfChildren} // Первый подвид
// {$DEFINE DynamicArrayOfChildren } // Второй подвид
// {$DEFINE ListOfBrothers} // Третий подвид

// Следует «включать» один и только один из этих трёх режимов

 

SysUtils;

 

{$IFDEF StaticArrayOfChildren }

N = 8;

{$ENDIF}

 

pMyTreeNode = ^MyTreeNode;

 

MyTreeNode = record // Узел дерева

iKey: integer;

nKey: integer;

 

{$IFDEF StaticArrayOfChildren }

mpChild: array [1 .. N] of pMyTreeNode;

{$ENDIF}

{$IFDEF DynamicArrayOfChildren }

mpChild: array of pMyTreeNode;

{$ENDIF}

{$IFDEF ListOfBrothers}

pChild, pNext: pMyTreeNode;

{$ENDIF}

end;

 

 

MyTableType = record // элемент таблицы посещаемости ключей дерева

iKey: integer;

nKey: integer;

end;

 

MyProcType = procedure (var pThis: pMyTreeNode);

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

pRoot: pMyTreeNode;

mTable: array of MyTableType;

iKeySought: integer;

nAux: integer;

procedure Away(i: integer);

// Процедура для «аварийного» завершения программы в нештатных ситуациях

WriteLN(‘Выброс – ‘, i);

ReadLN;

Halt;

end;

 

procedure ReadTree;

F: TextFile;

S: string;

iDepth, iDepthPrev, i: integer;

pCurr,pParent,pAux: pMyTreeNode;

mPath: array of pMyTreeNode;

 


if pRoot <> nil then exit;

 

Finalize(mPath);

 

AssignFile(F, 'Tree1.TXT');

Reset(F);

 

iDepthPrev:= -1;

 

<== предыдущая лекция | следующая лекция ==>
Деревья | While notEOF(F) do
Поделиться с друзьями:


Дата добавления: 2014-01-03; Просмотров: 321; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.