← Назад к вопросам

Какими свойствами обладает бинарное дерево поиска

2.0 Middle🔥 61 комментариев
#Коллекции

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Свойства бинарного дерева поиска

Бинарное дерево поиска (Binary Search Tree, BST) — это фундаментальная структура данных в информатике, которая обладает целым набором специфических свойств, делающих её эффективной для поиска, вставки и удаления элементов.

Основные свойства BST

1. Структурное свойство

Каждый узел имеет не более двух потомков: левого и правого. Это свойство определяет само понятие "бинарное дерево".

2. Свойство упорядоченности (Critical Property)

Это самое важное свойство BST:

  • Для каждого узла все значения в его левом поддереве строго меньше значения узла
  • Все значения в правом поддереве строго больше значения узла
  • Это свойство рекурсивно выполняется для всех поддеревьев
class TreeNode {
    int value;
    TreeNode left;   // все значения < value
    TreeNode right;  // все значения > value
}

3. Отсутствие дубликатов

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

Функциональные свойства

Временная сложность операций

  • Поиск: O(log n) в сбалансированном случае, O(n) в худшем (вырожденное дерево)
  • Вставка: O(log n) средняя, O(n) худшая
  • Удаление: O(log n) средняя, O(n) худшая
public boolean search(TreeNode root, int value) {
    if (root == null) return false;
    
    if (value == root.value) return true;
    else if (value < root.value) return search(root.left, value);
    else return search(root.right, value);
}

4. Inorder обход даёт отсортированный массив

Если пройти BST в порядке inorder (левое поддерево → узел → правое поддерево), получим элементы в порядке возрастания. Это следствие свойства упорядоченности.

public void inorderTraversal(TreeNode root) {
    if (root == null) return;
    inorderTraversal(root.left);      // левое
    System.out.println(root.value);   // узел
    inorderTraversal(root.right);     // правое
}

Дополнительные важные свойства

5. Сбалансированность (не обязательное, но желательное)

Высота дерева должна быть близка к log n. Несбалансированное дерево деградирует к связному списку.

// Несбалансированное (худшее)
    1
     \
      2
       \
        3
         \
          4  // O(n) для поиска

// Сбалансированное (хорошее)
      2
     / \
    1   3
         \
          4  // O(log n) для поиска

6. Уникальность пути к элементу

Для каждого значения существует только один возможный путь от корня до этого узла (если он существует). Это следует из свойства упорядоченности.

7. Минимум и максимум

  • Минимальный элемент всегда находится в самом левом узле
  • Максимальный элемент всегда находится в самом правом узле
public TreeNode findMin(TreeNode root) {
    while (root.left != null) {
        root = root.left;
    }
    return root;
}

public TreeNode findMax(TreeNode root) {
    while (root.right != null) {
        root = root.right;
    }
    return root;
}

Проверка, является ли дерево BST

public boolean isBST(TreeNode root) {
    return isBSTHelper(root, Long.MIN_VALUE, Long.MAX_VALUE);
}

private boolean isBSTHelper(TreeNode node, long min, long max) {
    if (node == null) return true;
    
    if (node.value <= min || node.value >= max) return false;
    
    return isBSTHelper(node.left, min, node.value) &&
           isBSTHelper(node.right, node.value, max);
}

Заключение

Бинарное дерево поиска — это элегантная структура, которая обеспечивает эффективный поиск благодаря свойству упорядоченности. Однако для гарантии O(log n) операций критична сбалансированность. Поэтому на практике часто используют самобалансирующиеся версии: AVL дерево, красно-чёрное дерево или B-деревья.

Какими свойствами обладает бинарное дерево поиска | PrepBro