Двоично дърво за търсене (BST) с пример

⚡ Умно обобщение

Двоичното дърво на търсене (BST) е дърво, базирано на възли, където лявото поддърво на всеки възел съдържа по-малки ключове, а дясното му поддърво съдържа по-големи ключове, което позволява бързо търсене, вмъкване и изтриване. То обхваща атрибути, типове, операции и псевдокод на BST.

  • 🌳 Подредени ключове: Ключовете на лявото поддърво са по-малки, а ключовете на дясното поддърво са по-големи от тези на родителското.
  • Бързо Operaции: Подреждането позволява търсенето, вмъкването и изтриването да се изпълняват ефективно чрез сравняване на стойности.
  • 🔍 Търсене: Сравнението във всеки възел изхвърля половината от дървото, премествайки се наляво или надясно.
  • Поставете: Нова стойност се поставя вляво или вдясно от корена въз основа на сравнението.
  • Изтрий: Изтриването обработва възли с нула, едно или две деца, използвайки предшественик или наследник.

Двоично дърво за търсене (BST) с пример

Какво е двоично дърво за търсене?

Двоичното дърво за търсене е усъвършенстван алгоритъм, използван за анализ на възела, неговите ляви и десни клонове, които са моделирани в дървовидна структура, и връщане на стойността. BST е разработено върху архитектурата на основен алгоритъм за двоично търсене; следователно, то позволява по-бързо търсене, вмъкване и премахване на възли. Това прави програмата наистина бърза и точна.

Атрибути на двоично дърво за търсене

BST се състои от множество възли и се състои от следните атрибути:

  • Възлите на дървото са представени във връзка родител-дете.
  • Всеки родителски възел може да има нула дъщерни възли или максимум два подвъзела или поддървета от лявата и дясната страна.
  • Всяко поддърво, известно още като двоично дърво за търсене, има подклонове отдясно и отляво на себе си.
  • Всички възли са свързани с двойки ключ-стойност.
  • Ключовете на възлите, присъстващи в лявото поддърво, са по-малки от ключовете на техния родителски възел.
  • По подобен начин, ключовете на възлите, присъстващи в дясното поддърво, са по-големи от ключовете на техния родителски възел.

Атрибути на двоично дърво за търсене

  1. Има главен възел или родителско ниво 11. Под него има леви и десни възли/клонове със собствени ключови стойности.
  2. Дясното поддърво има ключови стойности, по-големи от родителския възел.
  3. Лявото поддърво има ключови стойности по-малко от родителския възел.

Защо се нуждаем от двоично дърво за търсене?

  • Двата основни фактора, които правят двоичното дърво за търсене оптимално решение за всеки реален проблем, са скорост и точност.
  • Поради факта, че двоичното търсене е във формат, подобен на клон с отношения родител-дете, алгоритъмът знае в кое местоположение на дървото трябва да се търсят елементите. Това намалява броя на сравненията ключ-стойност, които програмата трябва да направи, за да намери желания елемент.
  • Освен това, в случай че елементът, който ще се търси, е по-голям или по-малък от родителския възел, възелът знае от коя страна на дървото да търси. Причината е, че лявото поддърво винаги е по-малко от родителския възел, а дясното поддърво има стойности, винаги равни или по-големи от родителския възел.
  • BST обикновено се използва за прилагане на сложни търсения, стабилна логика на играта, дейности за автоматично завършване и графики.
  • Алгоритъмът ефективно поддържа операции като търсене, вмъкване и изтриване.

Видове двоични дървета

Три вида двоични дървета са:

  • Пълно двоично дърво: Всички нива в дървото са пълни, с възможно изключение на последното ниво. По подобен начин всички възли са пълни, насочвайки се към най-лявата част.
  • Пълно двоично дърво: Всички възли имат 2 дъщерни възела, с изключение на листа.
  • Балансирано или перфектно двоично дърво: В дървото всички възли имат по две деца. Освен това, има едно и също ниво за всеки подвъзел.

Научете повече за Двоично дърво в структурата на данните ако си заинтересован.

Как работи дървото за двоично търсене?

Дървото винаги има основен възел и допълнителни дъщерни възли, независимо дали отляво или отдясно. Алгоритъмът изпълнява всички операции, като сравнява стойностите с корена и неговите следващи дъщерни възли съответно в лявото или дясното поддърво.

В зависимост от елемента, който ще бъде вмъкнат, претърсен или изтрит, след сравнението, алгоритъмът може лесно да премахне лявото или дясното поддърво на коренния възел.

BST предлага предимно следните три вида операции за ваша употреба:

  • Търсене: търси елемента от двоичното дърво.
  • Поставете: добавя елемент към двоичното дърво.
  • Изтрий: изтрива елемента от двоично дърво.

Всяка операция има своя собствена структура и метод на изпълнение/анализ, но най-сложната от всички е операцията Delete.

Търсене OperaАЦИ

Винаги започвайте анализа на дървото от коренния възел и след това се придвижвайте по-нататък към дясното или лявото поддърво на коренния възел, в зависимост от това дали елементът, който трябва да бъде локализиран, е по-малък или по-голям от корена.

Търсене OperaАЦИ

  1. Елементът, който ще се търси, е 10.
  2. Сравнете елемента с коренния възел 12, 10 < 12, следователно се премествате към лявото поддърво. Няма нужда да анализирате дясното поддърво.
  3. Сега сравнете 10 с възел 7, 10 > 7, така че преминете към дясното поддърво.
  4. След това сравнете 10 със следващия възел, който е 9, 10 > 9, потърсете в дясното дете на поддървото.
  5. 10 съвпада със стойността във възела, 10 = 10, връща стойността на потребителя.

Прякор Code за търсене в BST

search(element, root)
    if !root
        return -1
    if root.value == element
        return 1
    if root.value < element
        search(element, root.right)
    else
        search(element, root.left)

Поставете OperaАЦИ

Това е много проста операция. Първо се вмъква коренният възел, след което следващата стойност се сравнява с него. Ако стойността е по-голяма от корена, тя се добавя към дясното поддърво, а ако е по-малка от корена, се добавя към лявото поддърво.

Поставете OperaАЦИ

  1. Има списък от 6 елемента, които трябва да бъдат вмъкнати в BST по ред отляво надясно.
  2. Вмъкнете 12 като коренен възел и сравнете следващите стойности 7 и 9 за съответно вмъкване в дясното и лявото поддърво.
  3. Сравнете останалите стойности 19, 5 и 10 с коренния възел 12 и ги поставете съответно. 19 > 12, поставете го като дясното дете на 12; 5 < 12 и 5 < 7, следователно го поставете като лявото дете на 7. Сега сравнете 10, 10 е < 12 и 10 е > 7 и 10 е > 9, поставете 10 като дясното поддърво на 9.

Псевдокод за вмъкване на възел в BST

insert (element, root)
    Node x = root
    Node y = NULL
    while x:
        y = x
        if x.value < element.value
            x = x.right
        else
            x = x.left
    if y.value < element
        y.right = element
    else
        y.left = element

Изтрий Operaции

За изтриване на възел от BST има някои случаи, например изтриване на корен или изтриване на листен възел. Също така, след изтриване на корен, трябва да помислим за коренния възел.

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

  • Случай 1 – Възел с нула деца: Това е най-лесната ситуация, просто трябва да изтриете възела, който няма други деца отдясно или отляво.
  • Случай 2 – Възел с едно дете: След като изтриете възела, просто свържете неговия дъщерен възел с родителския възел на изтритата стойност.
  • Случай 3 – Възел с две деца: Това е най-трудната ситуация и тя работи по следните две правила:
    • 3a – Предшественик по ред: Трябва да изтриете възела с две деца и да го замените с най-голямата стойност в лявото поддърво на изтрития възел.
    • 3б – Наследник по ред: Трябва да изтриете възела с две деца и да го замените с най-малката стойност в дясното поддърво на изтрития възел.

Изтрий Operaции

  1. Това е първият случай на изтриване, при който изтривате възел, който няма деца. Както можете да видите на диаграмата, 19, 10 и 5 нямат деца. Но ние ще изтрием 19.
  2. Изтрийте стойността 19 и премахнете връзката от възела.
  3. Вижте новата структура на BST без 19.

Изтрий Operaции

  1. Това е вторият случай на изтриване, при който изтривате възел, който има 1 дете. Както можете да видите на диаграмата, 9 има едно дете.
  2. Изтрийте възел 9 и го заменете с неговия дъщерен възел 10, и добавете връзка от 7 към 10.
  3. Вижте новата структура на BST без 9.

Изтрий Operaции

  1. Тук ще изтриете възел 12, който има две деца.
  2. Изтриването на възела ще се извърши въз основа на правилото за предшественици по ред, което означава, че най-големият елемент в лявото поддърво на 12 ще го замени.
  3. Изтрийте възел 12 и го заменете с 10, тъй като това е най-голямата стойност в лявото поддърво.
  4. Вижте новата структура на BST след изтриване на 12.

Изтрий Operaции

  1. Изтрийте възел 12, който има две деца.
  2. Изтриването на възела ще се извърши въз основа на правилото за наследяване по ред, което означава, че най-малкият елемент в дясното поддърво от 12 ще го замени.
  3. Изтрийте възел 12 и го заменете с 19, тъй като това е най-малката стойност в дясното поддърво.
  4. Вижте новата структура на BST след изтриване на 12.

Прякор Code за изтриване на възел

delete (value, root):
    Node x = root
    Node y = NULL
    # searching the node
    while x:
        y = x
        if x.value < value
            x = x.right
        else if x.value > value
            x = x.left
        else if value == x
            break
    # if the node is not null, then replace it with successor
    if y.left or y.right:
        newNode = GetInOrderSuccessor(y)
        root.value = newNode.value
        # after copying the value of successor, delete the successor
        free(newNode)
    else
        free(y)

Важни условия

  • Поставете: Вмъква елемент в дърво / създава дърво.
  • Търсене: Търси елемент в дърво.
  • Преминаване през предварителна поръчка: Преминава през дърво по предварителен ред.
  • Обход по ред: Преминава през дърво по определен ред.
  • Преминаване през пощенска поръчка: Преминава през дърво по начин, следващ реда му.

Въпроси и Отговори

BST и техните балансирани варианти организират подредени данни зад функции на изкуствения интелект, като например автоматично довършване, дървета на решенията и бързо търсене по сортирани ключове. Те поддържат търсенето ефективно, което помага на системите с изкуствен интелект да извличат кандидати бързо по време на извод.

Да. Асистентите с изкуствен интелект могат да създават код за търсене, вмъкване и изтриване за BST в Python, Java или C++ от просто описание. Проверете внимателно логиката на изтриване, тъй като случаят с две деца е лесен за сбъркане.

Търсенето, вмъкването и изтриването се изпълняват за време O(log n) на балансирано BST. В най-лошия случай, небалансираното дърво се деградира до свързан списък, което прави операциите O(n), поради което често се използват самобалансиращи се дървета.

Обикновената BST може да стане небалансирана и бавна. Балансирана BST, като например AVL или червено-черно дърво, автоматично завърта възлите след вмъкване или изтриване, за да поддържа височината малка, гарантирайки O(log n) операции.

Обобщете тази публикация с: