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

I. Понятие и введение

Двоичное дерево поиска (англ.: Binary Search Tree), также известное как бинарное дерево поиска, бинарное дерево поиска, упорядоченное двоичное дерево или отсортированное двоичное дерево. Оно удовлетворяет следующим условиям:

  • Если его левое поддерево не пусто, все значения узлов в левом поддереве меньше значения его корневого узла.
  • Если его правое поддерево не пусто, все значения узлов в правом поддереве больше значения его корневого узла.

Его левое и правое поддеревья также являются двоичными деревьями поиска.

Как показано на рисунке ниже:

II. Примечания по применимости

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

Средняя временная сложность —O(log n), в худшем случае —O(n). Двоичные деревья поиска отличаются от куч; они не обязательно являются полными двоичными деревьями, и нижний уровень не легко представить напрямую с помощью массивов, поэтому для реализации двоичных деревьев поиска используются связанные списки.

 Поиск элементаВставка элементаУдаление элемента
Обычный массивO(n)O(n)O(n)
Упорядоченный массивO(logn)O(n)O(n)
Бинарное дерево поискаO(logn)O(logn)O(logn)

Ниже мы сначала представим метод двоичного поиска в виде массива как концептуальную основу, а затем продолжим знакомство с методом поиска в двоичных деревьях поиска.

III. Иллюстрация процесса метода двоичного поиска

Идея двоичного поиска была предложена в 1946 году. Задача поиска — очень важная фундаментальная задача в информатике. Двоичный поиск можно использовать только для упорядоченных последовательностей. Если мы хотим найти элемент, сначала смотрим на соотношение между средним значением V массива и целевыми данными. Возможны три случая:

  • 1. Если оно равно целевым данным, оно найдено сразу.
  • 2. Если оно меньше V, продолжаем поиск в группе меньше V.
  • 2. Если оно больше V, продолжаем поиск в группе больше V.

IV. Пример кода на Java

Загрузка пакета исходного кода:Скачать

Код файла src/example/binary/BinarySearch.java:

package example.binarySearch;

/**
* Метод бинарного поиска
 */

public class BinarySearch {
    // Метод бинарного поиска: найти target в отсортированном массиве arr
    // Если target найден, вернуть соответствующий индекс
    // Если target не найден, вернуть -1
    public static int find(Comparable[] arr, Comparable target) {

        // найти target в arr[l...r]
        int l = 0, r = arr.length-1;
        while( l <= r ){

            //int mid = (l + r)/2;
            // чтобы предотвратить переполнение целых чисел в экстремальных случаях, используйте следующую логику для вычисления mid
            int mid = l + (r-l)/2;

            if( arr[mid].compareTo(target) == 0 )
                return mid;

            if( arr[mid].compareTo(target) > 0 )
                r = mid - 1;
            else
                l = mid + 1;
        }

        return -1;
    }
}
Другие расширения