📘 О чем эта работа
Отчёт и исходный код посвящены реализации бинарного дерева поиска на языке C++ и задаче нахождения всех узлов, у которых высота левого и правого поддеревьев совпадает (и не равна нулю). Объектом являются узлы дерева (класс Node), предметом — методы вставки, вычисления высоты, обходов и освобождения памяти в классе BinaryTree.
📚 Что внутри
В комплект входят теоретическая часть с целью и алгоритмом, подробный листинг программы и демонстрационные примеры работы. Конкретно в коде реализовано:
- Класс Node с полями value, left, right и соответствующими геттерами/сеттерами.
- Класс BinaryTree с методами: insertRecursive (вставка), getHeight (рекурсивный расчёт высоты), findBalancedNodes (поиск вершин с одинаковой высотой поддеревьев), printTree (обход в ширину через std::queue и визуализация), printDescendants (рекурсивный вывод потомков), deleteTreeRecursive (рекурсивное удаление узлов).
- main.cpp: приём последовательности чисел от пользователя, построение дерева, вывод структуры и список вершины + потомков для найденных сбалансированных узлов.
- Визуализация: при печати дерева используются временные узлы со значением -1 для корректного отображения отсутствующих детей.
- Тесты: пример 1 — 8 3 10 1 6 14 4 7 13 (в результате вершины 8 и 6 имеют равные высоты поддеревьев); пример 2 — 1 2 3 4 5 6 7 8 (линейное дерево, сбалансированных узлов нет).
📊 Для кого подходит
Работа полезна студентам курсов по «Структурам данных» и «Алгоритмам», преподавателям для демонстраций, начинающим C++ разработчикам для практики рекурсии, указателей и управления памятью. Подходит для выполнения лабораторной работы в вузе или как шаблон для самостоятельных заданий.
✨ Особенности
Код полностью приводится в приложении: header-файл и cpp-реализация. Обращает на себя внимание практическая реализация вывода дерева через обход в ширину и создание временных узлов для визуализации структуры. Реализовано рекурсивное удаление узлов в деструкторе BinaryTree, что обеспечивает освобождение динамической памяти после завершения программы.
Замечание по эффективности: getHeight вызывается при проверке каждого узла внутри findBalancedNodes, поэтому в худшем случае возможны повторные вычисления высот (возможно O(n^2) для вырожденных деревьев). Это отражено в анализе и может быть улучшено кэшированием высот или однократным прохождением с возвратом высоты.
❓ Частые вопросы
Подойдет ли для моего ВУЗа?
Структура работы (тема, цель, алгоритм, результаты, выводы, листинг) соответствует типовым требованиям лабораторного отчёта в технических вузах.
Можно адаптировать?
Да. Листинг C++ можно расширить: добавить балансировку (AVL/Red-Black), оптимизировать вычисление высот или изменить формат ввода/вывода под требования преподавателя.
Контактные преимущества
Готовый код для компиляции: BinaryTree.h, BinaryTree.cpp и main.cpp. Включены комментарии и понятные имена методов, что облегчает быструю адаптацию и проверку. В отчёте есть разбор примеров и выводы по корректности работы функций.