Balanced binary trees, хранение данных поддерживается в отсортированном порядке, используются для достижения O (журнал (п)) поиска, удаления и вставки раз. «Сбалансированный» означает, что существует ограниченный предел между глубиной самых мелких и самых глубоких листьев, считая пустые левые/правые узлы листьями. (оптимально глубина левого и правого поддеревьев отличается не более чем одним, некоторые реализации ослабляют это, чтобы упростить алгоритмы)
Вы можете использовать массив, а не дерево, в отсортированном порядке с бинарным поиском для достижения O (log (n)), но тогда время вставки/удаления равно O (n).
Некоторые деревья (в частности, B-trees для баз данных) используют более двух ветвей на узел, чтобы расширить дерево и уменьшить максимальную глубину (которая определяет время поиска).
Я не могу придумать причину использования двоичных деревьев, которые не поддерживаются в отсортированном порядке (точка, о которой не упоминалось в большинстве ответов здесь), но, возможно, для этого есть приложение.
Помимо сортированного двоичного сбалансированного дерева, все, что связано с иерархией (как упоминают другие ответчики, XML или структуры каталогов), является хорошим приложением для деревьев, будь то двоичное или нет.
Редактировать: re: несортированные бинарные деревья: Я только что вспомнил, что LISP и Scheme очень сильно используют несбалансированные бинарные деревья. Функция cons
принимает два аргумента (например, (define c (cons a b))
) и возвращает узел дерева, ветви которого являются двумя аргументами. Функция car
принимает такой узел дерева и возвращает первый аргумент, заданный cons
. Функция cdr
аналогична, но возвращает второй аргумент cons
. Наконец nil
представляет собой нулевой объект. Это примитивы, используемые для создания всех структур данных в LISP и Scheme. Списки выполняются с использованием крайне несбалансированного двоичного дерева. Список, содержащий буквенные элементы 'Alabama
, 'Alaska
, 'Arizona
и 'Arkansas
можно построить в явном виде
(cons 'Alabama (cons 'Alaska (cons 'Arizona (cons 'Arkansas nil))))
и может перемещаться с помощью car
и cdr
(где car
используется, чтобы получить голову списка и cdr
используется для получить подсписку, исключая заголовок списка).Вот как работает Scheme, я думаю, что LISP такой же или очень похожий. Более сложные структуры данных, такие как бинарные деревья (для которых требуется 3 члена на узел: два для хранения левого и правого узлов и третий для хранения значения узла) или деревья, содержащие более двух ветвей на узел, могут быть построены с использованием списка для реализовать каждый узел.
Значит, вы можете хранить все, что вы храните в массиве в дереве? Но в дереве время поиска меньше ... Наверное, это только вступает в игру с структурами данных, содержащими множество данных. –
@ Тони: Не обязательно. Все, что имеет явную иерархию, хорошо подходит для деревьев (возможно, не для двоичных деревьев, а, конечно, для деревьев вообще), даже если это не так много предметов. (Подумайте о своем генеалогическом древе: даже если вы не знаете, что многие из ваших родственников это все еще дерево!) –
Двоичное дерево поиска требует ** O ** (log2 * n *). Для линейного списка требуется ** O ** (* n */2). В 8 элементах вы обнаружите, что дерево требует (самое большее) 3 сравнения, но для линейного поиска требуется (в среднем) 4. –