Обходы деревьев
Существует несколько способов обхода (просмотра) всех вершин дерева. Три наиболее часто используемых способа обхода называются:
-
в прямом порядке;
-
в обратном порядке;
-
в симметричном (внутреннем) порядке.
Все три способа обхода рекурсивно можно определить следующим образом:
-
если дерево Tree является пустым деревом, то в список обхода заносится пустая запись;
-
если дерево Tree состоит из одной вершины, то в список обхода записывается эта вершина;
-
если Tree – дерево с корнем n и поддеревьями Tree1, Tree2, … Treek, то:
-
при прохождении в прямом порядке сначала посещается корень n, затем в прямом порядке вершины поддерева Tree1, далее в прямом порядке вершины поддерева Tree2, и т.д. Последними в прямом порядке посещаются вершины поддерева Treek;
-
при прохождении в обратном порядке сначала посещаются в обратном порядке вершины поддерева Tree1, далее последовательно в обратном порядке посещаются вершины поддеревьев Tree2, … Treek. Последним посещается корень n;
-
при прохождении в симметричном порядке сначала посещаются в симметричном порядке вершины поддерева Tree1, далее корень n, затем последовательно в симметричном порядке вершины поддеревьев Tree2, … Treek.
Рисунок 15. Обходы деревьев
Далее приведены наброски процедур, реализующих указанные способы обходов деревьев. При доработке этих набросков необходимо учитывать конкретную реализацию деревьев.
procedure PreOrder(n: вершина);
{Обход дерева в прямом порядке}
begin
Занести в список обхода вершину n;
for для каждого потомка s вершины n в порядке слева направо do
PreOrder(s);
end;
procedure LastOrder(n: вершина);
{Обход дерева в обратном порядке}
begin
for для каждого потомка s вершины n в порядке слева направо do
LastOrder(s);
Занести в список обхода вершину n;
end;
procedure InOrder(n: вершина);
{Обход дерева в симметричном порядке}
begin
if n – лист then begin
занести в список обхода узел n;
end else begin
InOrder(самый левый потомок вершины n);
Занести в список обхода вершину n;
for для каждого потомка s вершины n, исключая самый левый,
в порядке слева направо do
InOrder(s);
end;
end;
- Содержание
- Основные сведения
- Понятия алгоритма и структуры данных
- Анализ сложности и эффективности алгоритмов и структур данных
- Структуры данных
- Элементарные данные
- Данные числовых типов
- Данные целочисленного типа
- Данные вещественного типа
- Операции над данными числовых типов
- Данные символьного типа
- Данные логического типа
- Данные типа указатель
- Линейные структуры данных
- Множество
- Линейные списки
- Линейный однонаправленный список
- Линейный двунаправленный список
- Циклические списки
- Циклический однонаправленный список
- Циклический двунаправленный список
- Разреженные матрицы
- Матрицы с математическим описанием местоположения элементов
- Матрицы со случайным расположением элементов
- Очередь
- Нелинейные структуры данных
- Мультисписки
- Слоеные списки
- Спецификация
- Реализация
- Деревья
- Общие сведения
- Обходы деревьев
- Спецификация двоичных деревьев
- Реализация
- Основные операции
- Организация
- Представление файлов b-деревьями
- Основные операции
- Общая оценка b-деревьев
- Алгоритмы обработки данных
- Методы разработки алгоритмов
- Метод декомпозиции
- Динамическое программирование
- Поиск с возвратом
- Метод ветвей и границ
- Метод альфа-бета отсечения
- Локальные и глобальные оптимальные решения
- Алгоритмы поиска
- Поиск в линейных структурах
- Последовательный (линейный) поиск
- Бинарный поиск
- Хеширование данных
- Функция хеширования
- Открытое хеширование
- Закрытое хеширование
- Реструктуризация хеш-таблиц
- Поиск по вторичным ключам
- Инвертированные индексы
- Битовые карты
- Использование деревьев в задачах поиска
- Упорядоченные деревья поиска
- Случайные деревья поиска
- Оптимальные деревья поиска
- Сбалансированные по высоте деревья поиска
- Поиск в тексте
- Прямой поиск
- Алгоритм Кнута, Мориса и Пратта
- Алгоритм Боуера и Мура
- Алгоритмы кодирования (сжатия) данных
- Общие сведения
- Метод Хаффмана. Оптимальные префиксные коды
- Кодовые деревья
- Алгоритмы сортировки
- Основные сведения. Внутренняя и внешняя сортировка
- Алгоритмы внутренней сортировки
- Сортировка подсчетом
- Сортировка простым включением
- Сортировка методом Шелла
- Сортировка простым извлечением.
- Древесная сортировка
- Сортировка методом пузырька
- Быстрая сортировка (Хоара)
- Сортировка слиянием
- Сортировка распределением
- Сравнение алгоритмов внутренней сортировки
- Алгоритмы внешней сортировки
- Алгоритмы на графах
- Алгоритм определения циклов
- Алгоритмы обхода графа
- Поиск в глубину
- Поиск в ширину (Волновой алгоритм)
- Нахождение кратчайшего пути
- Алгоритм Дейкстры
- Алгоритм Флойда
- Переборные алгоритмы
- Нахождение минимального остовного дерева
- Алгоритм Прима
- Алгоритм Крускала
- 190000, Санкт-Петербург, ул. Б. Морская, 67