Разница между двоичным деревом и двоичным деревом поиска

Ответы:

567

Двоичное дерево: дерево, в котором каждый узел имеет до двух листьев

  1
 / \
2   3

Двоичное дерево поиска: используется для поиска . Двоичное дерево, в котором левый потомок содержит только узлы со значениями, меньшими, чем родительский узел, и где правый потомок содержит только узлы со значениями, которые больше или равны родительскому.

  2
 / \
1   3
user541686
источник
14
@pete: Это концептуальная вещь, вы никогда не сделаете ее полностью без ограничений. Тем не менее, существует множество неискушенных двоичных деревьев, которые особенным образом отличаются, например, двоичными кучами.
user541686
19
Двусторонние деревья @pete не обязательно должны содержать сопоставимые данные, многие (не поисковые) двоичные деревья используются для разбора алгебраического выражения, двоичное дерево идеально подходит для написания синтаксического анализатора инфиксной записи, помещая оператор как узел (ы) и числовые значения как листья
JBoy
2
@JBoy: В этом случае они не будут бинарными деревьями. (например, унарные операторы не могут иметь двоих детей.) Я действительно не могу придумать практического варианта использования неограниченных двоичных деревьев, поэтому я сделал этот комментарий.
user541686
2
Великолепно и просто. +1 за наглядный пример :)
Андрей Константинов
@Mehrdad Бинарное дерево имеет одного или двух дочерних элементов на узел. Деревья выражений являются прекрасным примером. Бинарное дерево поиска также имеет одного или двух дочерних элементов на узел, если только оно не заполнено, что может произойти только с определенным числом элементов.
Маркиз Лорн
56

Бинарное дерево - это специализированная форма дерева с двумя дочерними элементами (слева и справа от ребенка). Это просто представление данных в древовидной структуре

Двоичное дерево поиска (BST) - это особый тип двоичного дерева, которое соответствует следующему условию:

  1. левый дочерний узел меньше своего родительского узла
  2. правый дочерний узел больше, чем его родительский узел
Jayzcode
источник
23
Этих условий недостаточно. Все левое поддерево не должно содержать ключей меньше, чем родительское, а все правое поддерево должно содержать больше узлов.
маркиз Лорн
1
@EJP, можешь ли ты уточнить свой комментарий, пожалуйста? что вы имеете в виду под всем поддеревом? Вы имеете в виду, что все значения поддерева должны быть меньше, чем root на левой стороне? и все значения должны быть больше корневого значения с правой стороны?
Асиф Муштак
Перейдя по второй ссылке, прочитайте раздел «Проверка», и все станет ясно.
Роб
38

Двоичное дерево состоит из узлов, где каждый узел содержит «левый» указатель, «правый» указатель и элемент данных. «Корневой» указатель указывает на самый верхний узел в дереве. Левый и правый указатели рекурсивно указывают на меньшие «поддеревья» с обеих сторон. Пустой указатель представляет двоичное дерево без элементов - пустое дерево. Формальное рекурсивное определение таково: двоичное дерево либо пустое (представлено нулевым указателем), либо состоит из одного узла, где левый и правый указатели (впереди рекурсивное определение) указывают на двоичное дерево.

Бинарное дерево поиска (BST) или «упорядоченное бинарное дерево» - это тип бинарного дерева, в котором узлы расположены по порядку: для каждого узла все элементы в его левом поддереве меньше узла (<), и все элементы в его правом поддереве больше, чем узел (>).

    5
   / \
  3   6 
 / \   \
1   4   9    

Дерево, показанное выше, является бинарным деревом поиска - «корневым» узлом является 5, а его левые узлы поддеревьев (1, 3, 4) имеют значение <5, а его правые узлы поддеревьев (6, 9) -> 5. Рекурсивно, каждое из поддеревьев должно также подчиняться ограничению бинарного дерева поиска: в поддереве (1, 3, 4) 3 является корнем, 1 <3 и 4> 3.

Не упустите точную формулировку в задачах - «двоичное дерево поиска» отличается от «двоичного дерева».

Эммануэль Одди
источник
@GabrielStaples Добавлена ​​древовидная структура.
Гаурав Бороле
14

Как все выше объяснили о разнице между двоичным деревом и двоичным деревом поиска, я просто добавляю, как проверить, является ли данное двоичное дерево бинарным деревом поиска.

boolean b = new Sample().isBinarySearchTree(n1, Integer.MIN_VALUE, Integer.MAX_VALUE);
.......
.......
.......
public boolean isBinarySearchTree(TreeNode node, int min, int max)
{

    if(node == null)
    {
        return true;
    }

    boolean left = isBinarySearchTree(node.getLeft(), min, node.getValue());
    boolean right = isBinarySearchTree(node.getRight(), node.getValue(), max);

    return left && right && (node.getValue()<max) && (node.getValue()>=min);

}

Надеюсь, это поможет вам. Извините, если я отклоняюсь от темы, поскольку я чувствовал, что стоит упомянуть об этом здесь.

Попытка
источник
1
Левое или правое поддерево может быть пустым. Ваш код не обрабатывает этот случай правильно.
маркиз Лорн
11

Двоичное дерево обозначает структуру данных, которая состоит из узлов, которые могут иметь только две дочерние ссылки.

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

Таким образом, все BST являются двоичным деревом, однако только некоторые двоичные деревья могут быть также BST . Сообщите, что BST является подмножеством двоичного дерева .

Таким образом, Binary Tree - это более общая структура данных, чем Binary Search Tree . А также вы должны уведомить, что Binary Search Tree является отсортированным деревом, тогда как для общего Binary Tree такого набора правил не существует .

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

А, Binary Treeкоторый не является BST;

         5
       /   \
      /     \
     9       2
    / \     / \
  15   17  19  21

Двоичное дерево поиска (отсортированное дерево)

Двоичное дерево , которое также Binary Tree ;

         50
       /    \
      /      \
     25      75
    /  \    /  \
  20    30 70   80

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

Также сообщите, что для любого родительского узла в BST ;

  • Все левые узлы имеют меньшее значение, чем значение родительского узла. В верхнем примере узлы со значениями {20, 25, 30}, которые все расположены слева ( левые потомки ) 50, меньше 50.

  • Все правильные узлы имеют большее значение, чем значение родительского узла. В верхнем примере узлы со значениями {70, 75, 80}, которые все расположены справа ( правые потомки ) 50, больше 50.

Для узла Binary Tree такого правила не существует . Единственное правило для Binary Tree Node - иметь двоих детей, поэтому оно самоопределяется, поэтому и называется двоичным .

Левент Дивилиоглу
источник
Можем ли мы реализовать простое двоичное дерево? есть ли реализация? а какая польза от этого дерева?
Асиф Муштак
@UnKnown Вы можете использовать бинарное дерево поиска для сортировки и поиска. Вы можете найти реализацию дерева двоичного поиска здесь: github.com/bzdgn/data-structures-in-java/blob/master/src/…
Левент Дивилиоглу,
Я знаю об этом, но существует ли простое дерево или простое двоичное дерево? или любая реализация Simple Binary Tree?
Асиф Муштак
Нет смысла использовать это, но вы можете добавить произвольные экземпляры Node к корню и дочерним элементам.
Левент Дивилиоглу
10

Двоичное дерево поиска - это особый вид двоичного дерева, которое обладает следующим свойством: для любого узла n значение каждого узла-потомка в левом поддереве n меньше значения n, а значение каждого узла-потомка в правом поддереве равно больше, чем значение n.

Каушик Леле
источник
8

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

Двоичное дерево может быть любым, у которого есть 2 дочерних и 1 родительский. Это может быть реализовано в виде связанного списка или массива, или с вашим пользовательским API. Как только вы начинаете добавлять в него более конкретные правила, оно становится более специализированным деревом . Наиболее распространенная известная реализация состоит в том, что добавьте меньшие узлы слева и более крупные справа.

Например, помеченное двоичное дерево размером 9 и высотой 3 с корневым узлом, значение которого равно 2. Дерево не сбалансировано и не отсортировано . https://en.wikipedia.org/wiki/Binary_tree

введите описание изображения здесь

Например, в дереве слева у A есть 6 детей {B, C, D, E, F, G}. Это может быть преобразовано в двоичное дерево справа.

введите описание изображения здесь

Бинарный поиск

Бинарный поиск - это методика / алгоритм, который используется для поиска определенного элемента в цепочке узлов. Бинарный поиск работает по отсортированным массивам .

Двоичный поиск сравнивает целевое значение со средним элементом массива; если они неравны, то половина, в которой цель не может находиться, удаляется, и поиск продолжается на оставшейся половине, пока она не будет успешной или оставшаяся половина не станет пустой. https://en.wikipedia.org/wiki/Binary_search_algorithm

введите описание изображения здесь

Дерево, представляющее бинарный поиск . Здесь ищется массив [20, 30, 40, 50, 90, 100], а целевое значение - 40.

введите описание изображения здесь

Двоичное дерево поиска

Это одна из реализаций двоичного дерева. Это специализировано для поиска .

Двоичное дерево поиска и структуры данных B-дерева основаны на двоичном поиске .

Бинарные деревья поиска (BST), иногда называемые упорядоченными или отсортированными двоичными деревьями, представляют собой особый тип контейнера : структуры данных, которые хранят «элементы» (такие как числа, имена и т. Д.) В памяти. https://en.wikipedia.org/wiki/Binary_search_tree

Двоичное дерево поиска размером 9 и глубиной 3, с 8 в корне. Листья не нарисованы.

введите описание изображения здесь

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

введите описание изображения здесь

Изображение взято из алгоритмов (4-е издание)

Теоман Шипахи
источник
4

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

нана яа
источник
4
  • Бинарное дерево поиска: когда выполняется обход по порядку в двоичном дереве, вы получаете отсортированные значения вставленных элементов.
  • Двоичное дерево: в любом виде обхода не найдено отсортированного заказа
AlienOnEarth
источник
Отсортированный заказ не требуется . Двоичное дерево поиска также является двоичным деревом. Они не являются взаимоисключающими. BST является подходящим подмножеством BT.
маркиз Лорн
3

Чтобы проверить, является ли данное Двоичное дерево бинарным деревом поиска, вот альтернативный подход.

Дерево обхода Inorder Fashion (т. Е. Left Child -> Parent -> Right Child), Хранить данные пройденного узла во временной переменной, скажем, temp , непосредственно перед сохранением в temp , Проверьте, выше ли данные текущего узла, чем предыдущие, или нет , Тогда просто разбейте его, дерево не является бинарным деревом поиска, пока не пройдете до конца.

Ниже приведен пример с Java:

public static boolean isBinarySearchTree(Tree root)
{
    if(root==null)
        return false;

    isBinarySearchTree(root.left);
    if(tree.data<temp)
        return false;
    else
        temp=tree.data;
    isBinarySearchTree(root.right);
    return true;
}

Поддерживать временную переменную снаружи

Neeraj Jain
источник
Любое поддерево может быть нулевым. Ваш алгоритм не обрабатывает этот случай правильно.
маркиз Лорн
1

В бинарном дереве поиска все узлы расположены в определенном порядке - узлы слева от корневого узла имеют меньшее значение, чем его корень, а все узлы справа от узла имеют значения, превышающие значение корень.

Спенсер Ченг
источник
0

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

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

jith912
источник