Пример использования рекурсивной процедуры при решении задачи подсчета листьев двоичного дерева.
Procedure Leafs_Count( q : nd; var k : integer );
Begin
If q <> nil
Then begin
Leafs_Count( q^.left, k );
If (q^.left = nil) and (q^.right = nil)
Then K := K +1;
{ это и является в данном
случае «обработкой» узла дерева }
Leafs_Count( q^.right, k );
End;
End;
{удаление дерева с освобождением памяти
рекомендуемый порядок обхода – снизу вверх}
Procedure del_tree(q : nd );
begin
if q<>nil
then begin
del_tree (q^.left);
del_tree (q^.right);
dispose(q)
end
end;
В заключение следует сказать о том, что рекурсивный обход дерева применим в большинстве задач, однако необходимо все же различать варианты эффективного применения двоичного поиска и сплошного обхода.
Перечень действий с деревьями
(для каждого варианта)
Стандартные действия.
1. Создание бинарного дерева:
а) из элементов созданного в лабораторной работе списка (см. часть 1);
б) из файла;
в) в диалоге с пользователем.
Способ формирования дерева: алгоритм бинарного поиска.
2. Сохранение дерева в файле.
3. Обход бинарного дерева каждым из трех способов (сверху вниз, снизу вверх, симметричный) с выдачей на экран содержимого информационных полей.
4. Включение элемента в бинарное дерево (согласно алгоритму формирования дерева).
5. Удаление заданного узла из дерева с его поддеревом (возможно удаление собственно узла)
6. Удаление дерева с освобождением памяти
Список дополнительных действий с бинарным деревом.
Определить количество листьев
Определить количество узлов (не листьев)
Определить количество листьев на заданном уровне дерева.
Определить максимальную глубину дерева
Определить количество листьев на каждом уровне дерева.
Определить количество узлов (не листьев) бинарного дерева.
Определить количество узлов (не листьев) бинарного дерева, находящихся на заданном уровне.
Определить количество узлов (не листьев) бинарного дерева, находящихся на одном уровне с узлом, заданным значением ключевого признака.
Определить, являются ли два поддерева, заданные своими корнями (с помощью значений ключевого признака) тождественными по структуре.
Определить общее количество узлов, (включая листья и корень), в поддереве данного узла, заданного значением ключевого признака.
Удалить все листья на заданном уровне дерева.
Удалить все листья дерева.
Удалить все узлы с заданным ключом ( вместе с поддеревьями, если есть ).
Отпечатать содержимое всех узлов, лежащих на пути между двумя узлами, заданными своими ключевыми признаками.
Отпечатать количество узлов, лежащих на пути между двумя узлами, заданными своими ключевыми признаками.
Отпечатать количество узлов, имеющих ключевые признаки, равные заданному, и лежащих на пути между двумя узлами, заданными своими ключевыми признаками.
Примечания.
Каждый элемент дерева имеет ключевой признак (числовое поле - целое без знака, аналог поля INF1 в элементе списка) с произвольным значением. Содержание информационного поля произвольно (символьное поле, аналог поля INF2 в элементе списка).
Управление выбором функций организовать с помощью меню (использовать лабораторную работу «Списки_файлы», добавив в меню соответствующие пункты.)
Для целей отладки, а впоследствии и для демонстрации программы на защите одной из первых должна быть реализованы подзадача 1-б общего перечня действий «Формирование дерева из записей файла». Файл, как и дерево, должен содержать легко контролируемую информацию, сформированную для отладки заранее.
Вопросы для повторения
Особенности использования статической и динамической памяти.
Описание динамических переменных.
Использование указателей и ссылочных переменных.
Основные процедуры и функции для выделения и освобождения памяти на логическом уровне.
Основные процедуры и функции для выделения и освобождения памяти на физическом уровне.
Особенности использования динамических переменных.
Особенности создания и обработки очередей.
Особенности создания и обработки стеков и деков.
Особенности создания и обработки однонаправленных списков.
Особенности создания и обработки двунаправленных списков.
Особенности создания и обработки кольцевых списков.
Особенности создания и обработки списков с головными элементами.
Особенности создания и обработки мультисписков.
Использование рекурсии при работе со списками.
Понятия дерева, двоичного дерева поиска.
Нерекурсивные способы создания и обработки двоичных деревьев.
Рекурсивные способы создания и обработки двоичных деревьев.