Бинарное дерево поиска (BST)

Начните со случайного бинарного дерева поиска и пошагово вставляйте, ищите или удаляйте значения: с представлением в виде массива и подсветкой кода C++.

Всё моделируется в этом браузере; ничего не отправляется на сервер.

Нет шагов

Нет шагов

Бинарное дерево поиска

Индекс в массиве

60[0]45[1]85[2]68[5]21[3]55[4]32[8]

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

Потомки индекса i находятся в 2i+1 и 2i+2.

  • Не связан
  • Уже пройден
  • Сравнивается
  • Найден
  • Новый
  • К удалению
  • Преемник

Нет шагов

Код

#include <iostream>
using namespace std;
class Node { // Узел хранит значение и указатели на двух потомков
private: // Приватные атрибуты: к ним обращаются только методы
int value;
Node* left;
Node* right;
public:
Node(int v) : value(v), left(nullptr), right(nullptr) {}
int getValue() const { return value; }
Node* getLeft() const { return left; }
Node* getRight() const { return right; }
void setValue(int v) { value = v; }
void setLeft(Node* n) { left = n; }
void setRight(Node* n) { right = n; }
};
Node* insert(Node* root, int v) { // Вставляет v в дерево поиска и возвращает корень
if (root == nullptr) // Пустое место: новый узел помещается сюда
return new Node(v); // Создаёт новый узел
if (v < root->getValue()) // Меньшие значения идут влево, большие — вправо
root->setLeft(insert(root->getLeft(), v)); // Спускается в левое поддерево
else
root->setRight(insert(root->getRight(), v)); // Спускается в правое поддерево
return root;
}
int main() {
Node* root = buildTree(); // Показанное дерево, уже построенное
root = insert(root, v); // Первый вызов, из main
return 0; // Конец операции
}

Этот инструмент начинает со случайного бинарного дерева поиска (BST) и позволяет менять его вручную: введите значение от 1 до 99 и нажмите «Вставить», «Найти» или «Удалить». Каждая операция анимируется по шагам на дереве, а узлы окрашены по роли: сравнивается, уже пройден, новый, на удаление или преемник. Ниже то же дерево показано в виде массива, где потомки индекса i находятся по индексам 2i+1 и 2i+2, а код на C++ подсвечивает выполняемую строку. Можно менять размер от 3 до 15 узлов, генерировать другое дерево и возвращаться к любому шагу. Всё имитируется в браузере.

Как пользоваться

  1. Задайте размер дерева ползунком или нажмите «Сгенерировать новое дерево», чтобы сменить исходное состояние.
  2. Введите значение от 1 до 99 и нажмите «Вставить», «Найти» или «Удалить»; анимация запустится сама.
  3. Двигайтесь вперёд или назад кнопками предыдущего и следующего шага либо нажмите «Пуск» и измените скорость.
  4. Следите за цветными узлами, представлением дерева в виде массива и подсвеченной строкой кода C++.

Часто задаваемые вопросы

Что такое бинарное дерево поиска и какое свойство оно сохраняет?
Это бинарное дерево, в котором у каждого узла не более двух потомков, а все значения в левом поддереве меньше значения узла, тогда как в правом больше. Благодаря этому при каждом сравнении отбрасывается половина оставшегося пути.
Как работают вставка и поиск в BST и сколько они стоят?
Обе операции начинаются с корня и сравнивают значение с каждым узлом: если оно меньше, идут влево, если больше, вправо. Поиск заканчивается, когда значение найдено или достигнут nullptr; вставка создаёт новый узел на этом пустом месте. Их стоимость пропорциональна высоте дерева: логарифмическая для сбалансированного и линейная для цепочки.
Каковы три случая удаления и зачем нужен inorder-преемник?
Если узел — лист, он просто удаляется; если у него один потомок, тот занимает его место; если два, в него копируется значение inorder-преемника, наименьшего в правом поддереве, а узел преемника удаляется. Преемник — следующее значение по порядку, поэтому он встаёт на это место без нарушения свойства BST, а так как у него нет левого потомка, его удаление относится к простым случаям.
Как дерево хранится в массиве и почему возникают пропуски?
В виде кучи: корень находится по индексу 0, а потомки индекса i по индексам 2i+1 и 2i+2. Если у узла нет потомка, эта позиция остаётся пустой, и чем несбалансированнее дерево, тем больше пропусков, ведь индексы растут с глубиной.

Похожие инструменты