Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Обход деревьев.

Читайте также:
  1. II. Экономия на условиях труда за счет рабочего. Пренебрежение самыми необходимыми затратами
  2. II. Экономия на условиях труда за счет рабочего. Пренебрежение самыми необходимыми затратами – продолжение 1
  3. II. Экономия на условиях труда за счет рабочего. Пренебрежение самыми необходимыми затратами – продолжение 2
  4. III.7 Определение необходимого количества стояночных (ручных) тормозов и тормозных башмаков
  5. IV. Обмен в пределах подразделения II. Необходимые жизненные средства и предметы роскоши
  6. ORACLE: НЕОБХОДИМОСТЬ ПОЯВЛЕНИЯ ЭФФЕКТИВНОЙ КОМАНДЫ ТОП-МЕНЕДЖЕРОВ
  7. VII.2. Разбор с преподавателем узловых вопросов, необходимых для освоения темы занятия

Бинарное дерево – это либо внешний узел, либо внутренний узел, связанный с парой бинарных деревьев, которые называются левым и правым поддеревьями этого узла.

Из этого определения становится понятно, что сами деревья – абстрактное математическое понятие. При работе с компьютерными представлениями мы работаем всего лишь с одной конкретной реализацией этой абстракции. Эта ситуация не отличается от представления действительных чисел значениями типа float, целых чисел значениями типа int и т. д.

Чаще всего применяется следующее корректное представление при реализации программ, использующих и манипулирующих бинарными деревьями, - структура с двумя связями (правой и левой) для внутренних узлов (рис.5.21). Эти структуры аналогичны связным спискам, но они имеют по две связи для каждого узла, а не по одной. Нулевые связи соответствуют внешним узлам. В частности, мы добавили связь к стандартному представлению связного списка следующим образом:

Struct node { Item item; node *l, *r; }

Typedef node *link;

что представляет собой всего лишь код С++ для определения %.1. Узлы состоят из элементов и пар указателей на узлы, и указатели на узлы называются также связями. Так, наприме6р, мы реализуем абстрактную операцию перехода к левому поддереву с помощью ссылки на указатель типа x = x->l.

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

 

Обход деревьев.

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

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

Рисунок 5.24. Полные бинарные деревья с семью и десятью внутренними узлами. Когда количество внешних узлов является степенью 2 (верхний рисунок), все внешние узлы в полном бинарном дереве располагаются на одном уровне. В противном случае (нижний рисунок) внешние узлы располагаются в двух уровнях при размещении внутренних узлов слева от внешних узлов предпоследнего уровня.
● Прямой обход (сверху вниз), при котором мы посещаем узел, а затем левое и правое поддеревья;

● Поперечный обход (слева направо), при котором мы посещаем левое поддерево, затем узел, а затем правое поддерево;

● Обратный обход (снизу вверх), при котором мы посещаем левое и правое поддеревья, а затем узел.

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

 

 


Дата добавления: 2015-07-26; просмотров: 50 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Поклонение: вхождение в Святое место| Эта рекурсивная функция делит массив

mybiblioteka.su - 2015-2024 год. (0.012 сек.)