До сих пор мы рассматривали структуры данных, данные в которых располагаются линейно. В связном списке — от первого узла к единственному последнему. В динамическом массиве — в виде непрерывного блока.
В этой части мы рассмотрим совершенно новую структуру данных — дерево. А точнее, двоичное (бинарное) дерево поиска (binary search tree). Бинарное дерево поиска имеет структуру дерева, но элементы в нем расположены по определенным правилам.
Также смотрите другие материалы этой серии: стеки и очереди, динамический массив, связный список, оценка сложности алгоритма, сортировка и множества.
Для начала мы рассмотрим обычное дерево.
Деревья
Дерево — это структура, в которой у каждого узла может быть ноль или более подузлов — «детей». Например, дерево может выглядеть так:

Структура организации
Это дерево показывает структуру компании. Узлы представляют людей или подразделения, линии — связи и отношения. Дерево — это самый эффективный представления и хранения такой информации.
// Внимание! Если программа не работает, обновите версию!
begin
var n:=ReadInteger('Количество строк в массиве:');
var m:=ReadInteger('Количество колонок в массиве:');
Writeln('*** Исходный массив [',n,',',m,'] ***');
var a:=MatrRandom(n,m,-99,99);
a.Println(4); Writeln(4*a.ColCount*'-');
var s:=a.ElementsWithIndexes;
var max:=s.MaxBy(x->x[2]);
var min:=s.MinBy(x->x[2]);
a.SwapRows(max[0],min[0]);
Writeln('*** Результирующий массив ***');
a.Println(4)
end.
Пример
Количество строк в массиве: 6
Количество колонок в массиве: 9
*** Исходный массив [6,9] ***
42 -66 -81 85 62 -36 -54 54 93
80 32 -85 -44 54 -99 72 53 59
20 50 27 98 -40 43 -52 -48 -92
37 -86 -53 -81 85 16 -31 -37 93
36 75 76 -95 38 -15 29 -86 97
12 94 -38 -52 86 -13 -99 91 1
*** Результирующий массив ***
42 -66 -81 85 62 -36 -54 54 93
20 50 27 98 -40 43 -52 -48 -92
80 32 -85 -44 54 -99 72 53 59
37 -86 -53 -81 85 16 -31 -37 93
36 75 76 -95 38 -15 29 -86 97
12 94 -38 -52 86 -13 -99 91 1