Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции по МОТС / ДИСКРЕТНАЯ МАТЕМАТИКА Графы.doc
Скачиваний:
377
Добавлен:
15.02.2014
Размер:
3.38 Mб
Скачать

9.3. Представление деревьев в эвм

Обсуждению представлений деревьев можно предпослать в точности те же рас­суждения, что были предпосланы обсуждению представлений графов (см. раз­дел 7.4). Кроме того, следует подчеркнуть, что задача представления деревьев в программе встречается гораздо чаще, чем задача представления графов общего вида, а потому методы ее решения оказывают еще большее влияние на практику программирования.

9.3.1. Представление свободных, ориентированных и упорядоченных деревьев

Всякое свободное дерево можно ориентировать, назначив один из узлов корнем. Всякое ордерево можно произвольно упорядочить. Всякое упорядоченное дерево можно представить бинарным деревом, проведя правую связь к старшему брату, а левую — к младшему сыну.

Пример

На рис. 9.10 приведены диаграммы упорядоченного и соответствующего ему би­нарного деревьев.

Рис. 9.10. Упорядоченное и бинарное деревья

Таким образом, достаточно рассмотреть представление в ЭВМ бинарных де­ревьев.

ЗАМЕЧАНИЕ-

Из данного представления следует, что множество бинарных деревьев взаимнооднозначно соответствует множеству упорядоченных лесов упорядоченных деревьев.

9.3.2. Представление бинарных деревьев

Обозначим через n(р) объем памяти, занимаемой представлением бинарного де­рева, где р — число узлов. Наиболее часто используются следующие представле­ния бинарных деревьев.

  1. Списочные структуры: каждый узел представляется записью типа N, содержащей два поля (l и r) с указателями на левый и правый узлы и еще одно поле i для хранения указателя на информацию об узле. Дерево представля­ется указателем на корень. Тип N обычно определяется следующим образом: N = record i : info; l, r : N end record. Для этого представления n(р) = Зр.

ЗАМЕЧАНИЕ -

Поскольку в бинарном дереве, как и в любом другом, q = р — 1, то из 2р указателей, отводимых для хранения дуг, р +1 всегда хранит значение nil, то есть половина связей не используется.

  1. Упакованные массивы: все узлы располагаются в массиве, так что все узлы поддерева данного узла располагаются вслед за этим узлом. Вместе с каждым узлом хранится индекс узла, который является последним узлом поддерева данного узла. Дерево Т обычно определяется следующим образом:

Т : array[l..p] of record i : info, k : 1..p end record. Для этого представления n(р) = 2р.

  1. Польская запись: аналогично, но вместо связей фиксируется «размеченная степень» каждого узла (например, 0 означает, что это лист, 1 — есть левая связь, но нет правой, 2 — есть правая связь, но нет левой, 3 — есть обе связи). Дерево Т определяется следующим образом:

Т: array [l..p] of record i : info, d : 0..3 end record.

Для этого представления п(р) = 1р. Если степень узлаизвестна из информации, хранящейся в самом узле, то можно не хранить и степень. Такой способ представления деревьев называется польской записью и обычно используется для представления выражений. В этом случае представление дерева оказывается наиболее компактным: объем памяти n(р) = р.

9.3.3. Обходы бинарных деревьев

Большинство алгоритмов работы с деревьями основаны на обходах. Возможны следующие основные обходы бинарных деревьев:

Прямой (левый) обход: попасть в корень,

обойти левое поддерево,

обойти правое поддерево.

Обратный (симметричный) обход: обойти левое поддерево,

попасть в корень,

обойти правое поддерево.

Концевой (правый) обход: обойти левое поддерево,

обойти правое поддерево,

попасть в корень.

Кроме трех основных, возможны еще три соответствующих обхода, отличающих­ся порядком рассмотрения левых и правых поддеревьев. Этим исчерпываются обходы, если в представлении фиксированы только связи «отец-сын».

ЗАМЕЧАНИЕ

Если кроме связей «отец-сын» в представлении есть другие связи, то возможны и другие (более эффективные) обходы. «Деревья», в которых пустые поля l и r в структуре N используются для хранения дополнительных связей, называются прошитыми деревьями.

Пример

Концевой обход дерева выражения а+ b с дает обратную польскую запись этого выражения: abc.

ОТСТУПЛЕНИЕ

Польская запись выражений (прямая или обратная) применяется в некоторых языках программирования непосредственно и используется в качестве внутреннего представле­ния программ во многих трансляторах и интерпретаторах. Причина заключается в том, что такая форма записи допускает очень эффективную интерпретацию (вычисление зна­чения) выражений. Например, значение выражения в обратной польской записи может быть вычислено при однократном просмотре выражения слева направо с использованием одного стека. В таких языках, как Forth и PostScript, обратная польская запись исполь­зуется как основная.