Открыть сервис

Бинарное дерево

Бинарное дерево — это иерархическая структура данных, в которой каждый узел (вершина) имеет не более двух потомков, называемых левым и правым дочерними узлами. Бинарные деревья являются фундаментальной абстракцией в информатике и программировании, используемой для эффективного хранения, поиска и сортировки данных, а также для представления иерархических зависимостей (например, синтаксических деревьев в компиляторах). В отличие от линейных структур (списков, массивов), бинарные деревья обеспечивают логарифмическую сложность основных операций (поиск, вставка, удаление) при сбалансированном построении.

Определение и основные понятия

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

Узел, не имеющий потомков, называется листом (терминальным узлом). Высота дерева — это максимальное количество рёбер от корня до самого удалённого листа. Глубина узла — количество рёбер от корня до этого узла. Размер дерева — общее количество узлов.

Свойства бинарных деревьев

История

Понятие бинарного дерева восходит к работам по комбинаторике и теории графов XIX века, но как структура данных оно получило развитие в середине XX века. В 1962 году Адельсон-Вельский и Ландис предложили АВЛ-деревья — первые самобалансирующиеся бинарные деревья поиска. В 1972 году Рудольф Байер и Эдвард МакКрейт разработали красно-чёрные деревья, ставшие стандартом в реализации ассоциативных массивов (например, в библиотеках STL C++ и Java Collections). В 1976 году Дональд Кнут в своей монографии «Искусство программирования» систематизировал алгоритмы обхода и манипуляции бинарными деревьями.

Классификация бинарных деревьев

Бинарные деревья классифицируются по различным признакам: структуре, способу упорядочивания, балансировке.

По структуре

По упорядочиванию

По балансировке

Специализированные типы

Устройство и реализация

Представление в памяти

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

В языках программирования (C++, Java, Python) узел определяется как класс или структура. Например, на C++:

``cpp struct Node { int data; Node left; Node right; }; ``

Для полных деревьев (например, кучи) может использоваться массив, где для узла с индексом \( i \) левый потомок имеет индекс \( 2i+1 \), а правый — \( 2i+2 \).

Операции

Сложность операций

Применение

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

Поиск и сортировка

Компиляторы и интерпретаторы

Сжатие данных

Искусственный интеллект и машинное обучение

Сетевые алгоритмы

Графика и игры

Примеры

Пример 1: Двоичное дерево поиска

Рассмотрим набор чисел: 5, 3, 7, 2, 4, 6, 8. Построенное BST: `` 5 / \ 3 7 / \ / \ 2 4 6 8 `` Поиск числа 4: 5 → 3 (меньше) → 4 (найдено). Сложность — \( O(\log n) \).

Пример 2: Бинарная куча

Максимальная куча для чисел 10, 20, 15, 30, 25: `` 30 / \ 20 15 / \ 10 25 `` Корень — максимальный элемент. После извлечения корня (30) куча перестраивается.

Критика и ограничения

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →