Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции_ по алгоритм и структуре.doc
Скачиваний:
56
Добавлен:
07.08.2019
Размер:
1.34 Mб
Скачать

4. 2. Основные операторы, используемые для работы с деревьями

Ниже приведённые операторы, как правило, используются при реализации деревьев посредством массивов, с использованием списков сыновей, через левых сыновей и правых братьев.

  1. PARENT – это оператор, который возвращает родителя для заданного узла из «дерева». Если заданный узел является корнем, то оператор возвращает условный знак, обозначающий «нулевой узел», что соответствует выходу за пределы «дерева».

  2. LEFTMOST_CHILD – этот оператор используется для определения самого левого сына заданного узла в «дереве». Если заданный узел является листом, то возвращается знак, обозначающий «нулевой узел», так как он не имеет сына.

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

  4. LABEL – осуществляет возврат метки заданного узла из «дерева». Для этого необходимо, чтобы на узлах «дерева» были определены метки.

  5. CREATEi – семейство операторов, создающих новый корень с определённой меткой, а далее для этого корня создаёт i сыновей, которые становятся корнями следующих поддеревьев. Эти операторы создают «дерево» с определённым корнем. Если i=0, то будет создан лишь один узел, который является одновременно и корнем, и листом.

  6. ROOT – этот оператор создаёт корень «дерева». Если в «дереве» ещё нет элементов, то возвращается знак, который говорит о том, что «дерево» пустое.

  7. MAKENULL – этот оператор делает заданное «дерево» пустым.

4. 3. Алгоритм создания дерева бинарного поиска

СТР. 70 В. И. ЛОЙКО

4. 4. Прохождение бинарных деревьев

Обсудив возможности рекурсии, вернемся к бинарным деревьям. Алгоритмы, используемые для добавления, исключения и поиска элементов в дереве, зависят не от количества узлов в дереве, а от его глубины, обеспечивая эффективность вычислений.

Рассмотрим задачу: как обойти дерево, отметив каждый узел один раз? Естественный порядок перенумерования элементов линейных списков от начала до конца не может быть применен для бинарных деревьев. Рассмотрим три метода прохождения, которые определяются рекурсивно:

рис. 24 - Прохождение бинарного дерева

1. Прохождение в прямом порядке

- попасть в корень;

- пройти в прямом порядке левое поддерево;

- пройти в прямом порядке правое поддерево.

Для дерева,получим: ABDGJKEHILMCF

2. Прохождение в симметричном порядке http://www.k-press.ru/cs/2000/3/trees/trees.asp

- пройти в симметричном порядке левое поддерево;

- попасть в корень;

- пройти в симметричном порядке правое поддерево.

Обход дерева даст следующую последовательность узлов: JGKDBHELIMACF

3. Прохождение в обратном порядке

- пройти в обратном порядке левое поддерево;

- пройти в обратном порядке правое поддерево;

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

Обойдя наше дерево, получим: JKGDHLMIEBFCA

Кроме выше указанных процедур приведены следующие процедуры и функции:

  • процедура включения в стек при нисходящем обходе (Push_st);

  • функция извлечения из стека при нисходящем обходе (Pop_st);

  • процедура включения в стек при восходящем и смешанном обходе (S_Push);

  • функция извлечения из стека при восходящем и смешанном обходе (S_Pop).

Для прошитых деревьев:

  • функция нахождения сына данного узла ( Inson );

  • функция нахождения отца данного узла ( Inp );

  • процедура включения в дерево узла слева от данного (leftIn);