Різниця між бінарним деревом та двійковим деревом пошуку


Відповіді:


566

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

  1
 / \
2   3

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

  2
 / \
1   3

14
@pete: Це концептуальна річ, ви не обов'язково ніколи насправді будете робити цілком необмежену. Однак є багато бінарних дерев, які не шукають, які є особливими в інший спосіб, наприклад, бінарні купи.
користувач541686

19
@pete біріальні дерева не обов’язково повинні містити порівнянні дані, багато (не шукають) двійкові дерева використовуються для розбору алгебраїчного вираження, двійкове дерево ідеально t. Написати інфіксатор нотаторів-аналізаторів, розмістивши оператора як вузол (и) та числові значення як листя
JBoy

2
@JBoy: Хоча в цьому випадку вони не будуть двійковими деревами. (наприклад, урядні оператори не можуть мати двох дітей.) Я дійсно не можу придумати практичний випадок використання для обмежених бінарних дерев, тому я зробив цей коментар.
користувач541686

2
Чудово і просто. +1 для наочного прикладу :)
Андрій Константинов

@Mehrdad Двійкове дерево має одного або двох дітей на вузол. Експрес-дерева - прекрасний приклад. Бінарне дерево пошуку також має одного або двох дітей на вузол, якщо воно не буває повним, що може статися лише з певною кількістю елементів.
Маркіз Лорн

56

Бінарне дерево - це спеціалізована форма дерева з двома дитинами (ліва дитина та права дитина). Це просто представлення даних у структурі дерева

Бінарне дерево пошуку (BST) - це особливий тип двійкового дерева, який відповідає наступній умові:

  1. лівий дочірній вузол менший, ніж його батьківський Вузол
  2. правий дочірній вузол більший, ніж його батьківський Вузол

23
Цих умов недостатньо. Все ліве піддерево повинно містити не більше ключів, ніж батьківське, а все праве піддерево повинно містити більше вузлів.
Маркіз Лорн

1
@EJP Ви можете будь-ласка розробити свій коментар? що ти маєш на увазі під цілим піддеревом? ви маєте на увазі, що всі значення піддерева повинні бути меншими, ніж корені з лівого боку? і всі значення повинні бути більшими за значення кореня з правого боку?
Асиф Муштак

Перейшовши за другим посиланням, прочитайте розділ "Перевірка" і це буде зрозуміло.
Роб

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 є Binary Tree, однак лише деякі Binary Tree можуть бути BST . Повідомте, що BST є підмножиною Бінарного дерева .

Отже, Бінарне дерево є більшою мірою загальною структурою даних, ніж Двійкове пошукове дерево . А також ви повинні повідомити, що Binary Search Tree - це сортоване дерево, тоді як для загального Binary Tree немає такого набору правил .

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

Binary TreeЯкий НЕBST ;

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

Двійкове дерево пошуку (сортоване дерево)

Двійкове дерево , яке також Binary Tree ;

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

Властивість Binary Search Tree Node

Також повідомляйте, що для будь-якого батьківського вузла в BST ;

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

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

Для Бінарного Вузола Дерево такого правила немає . Єдине правило для Binary Tree Node - це наявність двох дітей, тому він сам пояснює себе, чому називається двійковим .


Чи можемо ми реалізувати просте бінарне дерево? чи доступна реалізація? і в чому користь цього дерева?
Асиф Муштак

@UnK known Ви можете використовувати Binary Search Дерево для сортування та пошуку. Ви можете знайти реалізацію Бінарного
Levent Divilioglu

Я знаю про це, але чи існує просте дерево або просте бінарне дерево? чи будь-яка реалізація простого бінарного дерева?
Асиф Муштак

Немає сенсу використовувати це, але ви можете додати до кореня та дітей довільні екземпляри Вузла.
Левент Дівіліоглу

10

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


8

Двійкове дерево

Бінарним деревом може бути все, що має 2 дитини та одного батька. Він може бути реалізований у вигляді пов'язаного списку чи масиву, або за допомогою власного 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
  • Двійкове дерево пошуку: коли на двійковому дереві робиться внутрішній обхід, ви отримуєте відсортовані значення вставлених елементів
  • Бінарне дерево: відсортований порядок не зустрічається в жодному вигляді обходу

Відсортованого замовлення не потрібно знайти. Двійкове дерево пошуку також є двійковим деревом. Вони не є взаємовиключними. BST - це належна підмножина BT.
Маркіз Лорн

3

Перевірити, чи є чи не дане бінарне дерево є двійковим деревом пошуку, ось альтернативний підхід.

Траверс дерева в Симетричною моді (тобто зліва від дітей -> Батько -> Право дитина), магазин , прохідне вузол даних в тимчасовому змінному дозволяє сказати , що темп , просто перед збереженням в темп , перевірка даних поточної погоди в Node вище , то попередня чи ні . Тоді просто розбийте його, дерево не є двійковим деревом пошуку, інакше пройдіть до кінця.

Нижче наводиться приклад з 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;
}

Підтримуйте змінну temp зовні


Будь-яке піддерево може бути недійсним. Ваш алгоритм неправильно обробляє цей випадок.
Маркіз Лорн

1

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


0

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.