Menu
Coddy logo textTech

Drzewo BST (binarne drzewo poszukiwań)

Ostatnia aktualizacja

Binarne drzewo poszukiwań przechowuje wartości w posortowanym porządku: dla każdego węzła wszystkie wartości w lewym poddrzewie są mniejsze, a wszystkie wartości w prawym poddrzewie większe. Aby wstawić lub znaleźć wartość, zaczynasz od korzenia i w zależności od wyniku porównania idziesz w lewo lub w prawo, więc każdy krok zmniejsza przestrzeń wyszukiwania o połowę. Kliknij odtwarzanie powyżej i zobacz, jak wartości trafiają na miejsce przez porównania, a wyszukiwanie schodzi w dół drzewa.

W zrównoważonym drzewie te operacje działają w czasie O(log n). Haczyk: wstawianie już posortowanych danych sprawia, że drzewo degeneruje się do listy jednokierunkowej z operacjami w O(n), i właśnie dlatego istnieją samorównoważące się warianty, takie jak drzewa AVL i czerwono-czarne.

Złożoność czasowa i pamięciowa

OperacjaZrównoważoneNajgorszy przypadek (przekrzywione)
WyszukiwanieO(log n)O(n)
WstawianieO(log n)O(n)
UsuwanieO(log n)O(n)
PamięćO(n)O(n)

Krok po kroku (wstawianie)

KrokCo się dzieje
1Jeśli drzewo jest puste, nowa wartość zostaje korzeniem.
2W przeciwnym razie zacznij od korzenia.
3Jeśli wartość jest mniejsza, przejdź do lewego dziecka; jeśli większa, idź w prawo.
4Powtarzaj, aż dotrzesz do pustego miejsca.
5Dołącz tam nową wartość jako liść.

Przykład krok po kroku

Wstawianie [5, 3, 8, 1, 4] do pustego drzewa, po jednej wartości:

Wstawiana wartośćPrzebyta ścieżkaDziałanie
5-Drzewo jest puste, więc 5 zostaje korzeniem.
353 < 5, idź w lewo; miejsce jest puste, dołącz 3 jako lewe dziecko 5.
858 > 5, idź w prawo; miejsce jest puste, dołącz 8 jako prawe dziecko 5.
15 -> 31 < 5 idź w lewo, potem 1 < 3 idź w lewo; dołącz 1 jako lewe dziecko 3.
45 -> 34 < 5 idź w lewo, potem 4 > 3 idź w prawo; dołącz 4 jako prawe dziecko 3.

Kiedy używać binarnego drzewa poszukiwań

Używaj, gdyUnikaj, gdy
Potrzebujesz porządku i szybkiego wyszukiwania, a wstawienia przychodzą w losowej kolejności.Dane przychodzą już posortowane: niezrównoważone drzewo BST degraduje się do O(n) na operację.
Chcesz, aby przejście in-order za darmo zwracało wartości w posortowanej kolejności.Potrzebujesz tylko sprawdzania przynależności bez porządku: tablica haszująca daje średnio O(1) na wyszukiwanie.
Potrzebujesz zapytań o zakres albo następnika lub poprzednika klucza.Potrzebujesz gwarantowanych ograniczeń O(log n): sięgnij po samorównoważące się drzewo AVL lub czerwono-czarne.
Zbiór danych często się zmienia, a aktualizacja statycznej posortowanej tablicy byłaby kosztowna.Zbiór danych jest stały i tylko do odczytu: posortowana tablica z wyszukiwaniem binarnym jest prostsza i przyjazna dla pamięci podręcznej.

Binary Search Tree: kod

Przejrzysta, gotowa do uruchomienia implementacja algorytmu Binary Search Tree w językach: Python, JavaScript, Java, C++, C. Wybierz język, skopiuj kod albo otwórz go od razu w edytorze online Coddy.

Binary Search Tree: kod (Python)

Python
1class Node:2    def __init__(self, key):3        self.key = key4        self.left = None5        self.right = None6
7
8def insert(node, key):9    if node is None:10        return Node(key)11    if key < node.key:12        node.left = insert(node.left, key)13    elif key > node.key:14        node.right = insert(node.right, key)15    return node  # duplicates are ignored16
17
18def search(node, key):19    if node is None:20        return False21    if key == node.key:22        return True23    if key < node.key:24        return search(node.left, key)25    return search(node.right, key)26
27
28def inorder(node):29    if node is None:30        return []31    return inorder(node.left) + [node.key] + inorder(node.right)32
33
34root = None35for key in [8, 3, 10, 1, 6, 14, 4, 7]:36    root = insert(root, key)37
38print("Inorder (sorted):", inorder(root))39print("search(6): ", search(root, 6))40print("search(5): ", search(root, 5))
Uruchom ten kod w edytorze Python online

Drzewo BST: najczęstsze pytania

Jaka jest złożoność czasowa binarnego drzewa poszukiwań?
Wyszukiwanie, wstawianie i usuwanie mają złożoność O(log n) w zrównoważonym drzewie, bo każde porównanie odrzuca połowę pozostałych węzłów. W najgorszym przypadku, gdy posortowane wstawienia przekrzywią drzewo w łańcuch, degradują się do O(n).
Czym różni się drzewo binarne od binarnego drzewa poszukiwań?
Drzewo binarne to dowolne drzewo, w którym każdy węzeł ma najwyżej dwoje dzieci, bez reguły porządku. Binarne drzewo poszukiwań dodaje niezmiennik: wartości w lewym poddrzewie są mniejsze, a w prawym większe od węzła, i właśnie to umożliwia szybkie wyszukiwanie.
Dlaczego binarne drzewo poszukiwań może działać wolno?
Jeśli wartości są wstawiane w kolejności posortowanej (lub odwrotnie posortowanej), każdy nowy węzeł trafia na tę samą stronę, co tworzy wysokie, przekrzywione drzewo zachowujące się jak lista jednokierunkowa, czyli O(n) na operację. Drzewa samorównoważące się (AVL, czerwono-czarne) wykonują rotacje węzłów, aby temu zapobiec.
Czym różni się binarne drzewo poszukiwań od tablicy haszującej?
Tablica haszująca daje średnio O(1) na wyszukiwanie, ale przechowuje klucze bez określonego porządku, więc nie odpowie na zapytania o zakres ani o następnika. Binarne drzewo poszukiwań jest nieco wolniejsze, O(log n), ale utrzymuje klucze w porządku, co pozwala przechodzić je w posortowanej kolejności i znajdować najbliższe wartości. Wybierz BST, gdy liczy się porządek, a tablicę haszującą, gdy potrzebujesz tylko sprawdzania przynależności.
Kiedy użyć drzewa samorównoważącego się zamiast zwykłego BST?
Używaj drzewa samorównoważącego się (AVL, czerwono-czarnego) zawsze, gdy nie kontrolujesz kolejności wstawiania i potrzebujesz gwarantowanej wydajności O(log n). Zwykłe drzewo BST sprawdzi się w nauce, przy małych zbiorach danych lub gdy klucze przychodzą w losowej kolejności, ale nie chroni przed przekrzywionym najgorszym przypadkiem.
Czy przejście in-order drzewa BST zwraca posortowane wartości?
Tak. Odwiedzenie lewego poddrzewa, potem węzła, a potem prawego poddrzewa zwraca klucze w kolejności rosnącej, co wynika bezpośrednio z niezmiennika BST. Częsty błąd to oczekiwanie tego samego od zwykłego drzewa binarnego: bez reguły porządku przejście in-order nie daje żadnej sensownej sekwencji.
Ilustracja języków programowania w Coddy

Opanuj algorytmy z Coddy

ZACZNIJ