Новосибирский Государственный Университет
Опубликован: 08.11.2006 | Доступ: свободный | Студентов: 1941 / 96 | Оценка: 4.27 / 4.09 | Длительность: 12:16:00
Специальности: Программист
Лекция 4:

Последовательности (деревья)

< Лекция 3 || Лекция 4: 123 || Лекция 5 >

Представления

Почти все машинные представления деревьев основаны на связанных распределениях. Каждый узел состоит из поля INFO и нескольких полей для указателей. Например, представление, которое будет удобным для изложения множества и мультимножества, для каждого узла имеет единственное поле для указателя FATHER, указывающего на отца данного узла. При этом приведенное на рис. 4.1 дерево будет выглядеть так, как показано на рис. 4.5. Такое представление полезно, если необходимо подниматься по дереву от потомков к предкам. Такая операция встречается довольно редко. Чаще требуется опуститься по дереву от предков к потомкам.

Представление дерева (или леса) с использованием указателей, ведущих от предков к потомкам, довольно сложно, поскольку узел, имея не более чем одного отца, может в то же время иметь произвольно много сыновей. Другими словами, при таком представлении узлы должны различаться по размеру, что является определенным неудобством. Один из путей обхода этой трудности состоит в том, чтобы определить соответствие между деревьями и бинарными деревьями, поскольку бинарные деревья легко представить узлами фиксированного размера.


Рис. 4.5.

Каждый узел в этом случае имеет три поля: LEFT, указатель местоположения корня левого поддерева, INFO, содержимое узла, и RIGHT, указатель местоположения корня правого поддерева. Все сказанное выше проиллюстрировано на рис. 4.6.


Рис. 4.6.

Можно представлять деревья как бинарные, используя узлы фиксированного размера, представляя каждый узел леса в виде узла, состоящего из полей LEFT, INFO, RIGHT. При этом LEFT предназначается для указания самого левого сына данного узла, а поле RIGHT - для указания следующего брата данного дочернего/сыновнего узла.

Прохождения

Во многих приложениях необходимо пройти лес, заходя в узлы, то есть обрабатывая их некоторым систематическим образом. Посещение каждого узла может быть связано с простой операцией, такой как печать содержимого, или со сложной, такой как вычисление функции. Будем предполагать, что при посещении узла структура леса не меняется. Рассмотрим четыре основных способа прохождения леса: в глубину, снизу вверх, в горизонтальном порядке и для бинарных деревьев - в симметричном порядке.

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

  1. Посетить корень первого дерева.
  2. пройти в глубину поддерева первого дерева (если оно есть).
  3. Пройти в глубину оставшиеся деревья, если они есть.

Например, для леса, показанного на рис. 4.7, узлы будут проходиться в следующем порядке: A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S.

Лес

Рис. 4.7. Лес

Название "в глубину" отражает тот факт, что после посещения некоторого узла мы продолжаем прохождение в глубь дерева всякий раз, когда это возможно. Такой порядок особенно полезен в процедурах поиска.

Для бинарных деревьев эта процедура упрощается и выглядит следующим образом.

  1. Посетить корень.
  2. Пройти в глубину левое поддерево
  3. Пройти в глубину правое поддерево.

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

  • Пройти снизу вверх поддеревья первого дерева, если они есть.
  • Посетить корень первого дерева.
  • Пройти снизу вверх оставшиеся деревья, если они есть.

Название "снизу вверх" связано с тем, что в момент посещения произвольного узла его потомки оказываются уже пройденными. Такой порядок прохождения полезен, в частности, потому, что он позволяет вычислять рекурсивно определенные функции на лесах. При этом порядке прохождения узлы леса, показанного на рис. 4.7, проходятся в такой последовательности: B,D,E,F,C,G,J,K,I,L,H,A,O,P,N,R,Q,S,M. Рекурсивная процедура прохождения снизу вверх применительно к бинарным деревьям имеет следующий вид:

  1. Пройти снизу вверх левое дерево.
  2. Пройти снизу вверх правое дерево.
  3. Посетить корень.

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

  1. Пройти в симметричном порядке левое поддерево.
  2. Посетить корень.
  3. Пройти в симметричном порядке правое поддерево.

Такой способ прохождения известен также как лексикографический порядок или внутренний порядок. Заметим, что прохождение леса снизу вверх эквивалентно прохождению в симметричном порядке бинарного дерева, соответствующего этому лесу (при естественном соответствии).

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

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

Это сходство позволяет построить общий нерекурсивный алгоритм, который может быть применен к каждому из этих порядков прохождения бинарных деревьев.

Горизонтальный порядок прохождения. При таком способе узлы леса проходятся слева направо, уровень за уровнем от корня вниз. Таким образом, в соответствии с этой процедурой узлы леса, показанного на рис.4.7, будут проходиться в следующем порядке: A,M,B,C,G,H,N,Q,S,D,E,F,I,L,O,P,R,J,K. Такое прохождение дерева полезно в определенных алгоритмах на графах.

< Лекция 3 || Лекция 4: 123 || Лекция 5 >