Strona głównaArtykułyDrzewo Binarne Wyszukiwań Dwoinkowych

Drzewa Binarne Wyszukiwania Dwoinkowe: Wstawianie, Wyszukiwanie i Utrzymywanie Równowagi AVL

Dlaczego ta sama invariant wyszukiwania, która daje O(log n) wyszukiwanie, może cicho pogorszyć się do O(n), a rotacje AVL utrzymują drzewo zbalansowane poprzez każdy wstawianie i usuwanie.

mysimulator teamZaktualizowano — czerwiec 2026≈ 8 min czytania▶ Otwórz symulację

Jedna niezmiennaość, trzy operacje

Drzewo binarne wyszukiwania (BST) przechowuje klucze zgodnie z jedną niezmienną: dla każdego węzła, wszystko w jego lewej poddrzewie jest mniejsze, a wszystko w jego prawej poddrzewie jest większe. Ta niezmienna sama w sobie wystarcza do wykonania wyszukiwania, wstawiania i usuwania wszystkich zgodnie z tym samym wzorem — porównaj klucz docelowy z bieżącym węzłem i rekurencyjnie przeszukuj lewo lub prawo — przekształcając to, co w przeciwnym razie byłoby liniową analizą, w ścieżkę w dół drzewa.

search(node, key):
  if node is null: return not found
  if key == node.key: return node
  if key < node.key: return search(node.left, key)
  else:                return search(node.right, key)
insert: search until you fall off the tree, attach a new leaf there
delete: 0 or 1 child -> splice node out; 2 children -> replace with in-order successor
demo na żywo · powiązana symulacja● LIVE

Złożoność zależy w całości od kształtu drzewa

Wszystkie trzy operacje kosztują O(h), gdzie h oznacza wysokość drzewa. Dla idealnie zbalansowanego drzewa z n kluczami, h = O(log n), więc wyszukiwanie, wstawianie i usuwanie są wszystkie logarytmiczne. Jednak BST zbudowany przez wstawianie kluczy już posortowane degeneruje się w prostą łańcuchową strukturę, z h = n − 1: drzewo staje się strukturalnie listą powiązaną, a każda operacja kosztuje O(n). Inwersja BST gwarantuje poprawność; nie gwarantuje ona równowagi.

In-order przemieszczenie odzyskuje posortowany porządek za darmo

Odwiedzanie BST w kolejności in-order (lewe poddrzewo, węzeł, prawe poddrzewo, rekurencyjnie) zawsze daje klucze w rosnącym, posortowanym porządku, bezpośredni wynik z zasady wyszukiwania. To jeden z powodów, dla których warto używać BST zamiast tabeli hash, gdy potrzebujesz zapytań o zakres lub iteracji posortowanej: tabela hash zapewnia średnio O(1) wyszukiwanie, ale nie gwarantuje porządku, a zbalansowany BST oferuje O(log n) wyszukiwanie i uzyskanie posortowanego wyniku jako efekt uboczny.

Drzewa AVL: Balansowanie przez rotację

Drzewo AVL (Adelson-Velsky i Landis, 1962) przywraca gwarancję logarytmiczną poprzez egzekwowanie pewnej cechy równowagi po każdym wstawieniu i usunięciu: dla każdego węzła różnica wysokości jego poddrzew lewego i prawego nie przekracza 1. Gdy operacja narusza tę cechę, drzewo wykonuje rotację - lokalną restrukturyzację kilku wskaźników, która przywraca równowagę bez łamania właściwości drzewa poszukiwania.

prawy obrót wokół węzła y (naprawia niezbalansowanie lewo-lewe): y x / \ / \ x C -> A y / \ / \ A B B C (lewy obrót jest lustrzanym odbiciem) Ponieważ rotacja jedynie przekształca stałą liczbę wskaźników, a maksymalnie jeden niezbalansowanie wymaga naprawy na drodze powrotnej do korzenia, każde wstawienie lub usunięcie kosztuje O(log n) dla wyszukiwania plus w najgorszym przypadku O(log n) dla ponownego zbilansowania. Drzewa AVL utrzymują wysokość w granicach około 1,44 log2(n), bardziej precyzyjne ograniczenie niż drzewo czerwono-czarne, które nieco luźniej balansuje i wykonuje mniej rotacji na aktualizację.

right rotation around node y (fixes left-left imbalance):
      y                x
     / \                / \
    x   C     ->      A   y
   / \                    / \
  A   B                  B   C
(a left rotation is the mirror image)

Dlaczego utrzymywanie równowagi jest tego wart

Cała zaleta BST (drzewa binarne wyszukiwania) w porównaniu z prostym, posortowanym tablicą to O(log n) operacji wstawiania i usuwania zamiast O(n) przesunięć. Ta zaleta znika natychmiast, gdy drzewo jest dozwolone do degeneracji. Warianty samowzrostowe – AVL, czerwono-czarne, drzewa splayowe – wszystkie istnieją, aby zapewnić gwarancję O(log n) dla każdej sekwencji operacji, a nie tylko w sprzyjających warunkach, kosztem współczynnika równowagi dla każdego węzła i okazjonalnych rotacji.

Frequently asked questions

Dlaczego drzewo binarne wyszukiwania (BST) może stać się tak wolne jak lista powiązań?

Inwariant BST ogranicza jedynie względny porządek, a nie kształt. Wstawianie kluczy w już posortowany sposób sprawia, że każdy nowy węzeł przyłącza się jako najprawdziwszy (najbardziej prawe) dziecko poprzedniego węzła, tworząc prostą łańcuch o wysokości n-1 zamiast zbalansowanego drzewa o wysokości log n — każdy wyszukiwanie wtedy kosztuje O(n).

Co robi rotacja AVL?

Jest to lokalna, stałorotunkowa (konstanty czasowej) reorganizacja kilku wskaźników rodzic-dziecko wokół punktu niezrównoważenia, która przywraca inwariant wysokości zbalansowanej, zachowując jednocześnie inwariant porządku BST. łańcuch tych rotacji, maksymalnie O(log n) z nich, naprawi wszelkie niezrównoważenie wprowadzone przez jedno wstawienie lub usunięcie.

Czy kolejność w-porządku (in-order traversal) zawsze jest posortowana, nawet w nieobciążonym BST?

Tak — sortowność pochodzi wyłącznie z inwarycji lewej-mniejsze, prawe-większe, która zachodzi niezależnie od wysokości i balansu drzewa. Nieobciążone BST daje posortowane wyjście równie wiarygodnie jak zbalansowane; tylko czas przechodzenia i złożoność wyszukiwania/wstawiania/usuwania zależy od równowagi.

Wypróbuj na żywo

Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Binary Search Tree i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.

▶ Otwórz symulację Binary Search Tree

Co znalazłeś?

Dodaj kroki odtworzenia (opcjonalnie)