Drzewo binarne wyszukiwań (BST)

1. Czym jest BST?

BST (Binary Search Tree) to drzewo binarne z specjalną właściwością dotyczącą uporządkowania:

Właściwość BST:

Dla każdego węzła: - Lewa poddrzewo zawiera wartości mniejsze - Prawa poddrzewo zawiera wartości większe

Wizualizacja:

        10
       /  \
      5    15
     / \   / \
    3   7 12  20

✅ To jest BST:
- Lewa od 10: {5, 3, 7} < 10
- Prawa od 10: {15, 12, 20} > 10
- Lewa od 5: {3} < 5
- Prawa od 5: {7} > 5
        10
       /  \
      15   5

❌ To NIE jest BST:
- 15 > 10 ale jest po lewej!

2. Implementacja węzła BST


3. Wstawianie do BST

3.1. Algorytm:

  1. Jeśli drzewo puste → nowy węzeł staje się korzeniem
  2. Porównaj z obecnym węzłem:
  3. Jeśli mniejszy → idź w lewo
  4. Jeśli większy → idź w prawo
  5. Powtarzaj aż znajdziesz puste miejsce

3.2. Implementacja rekurencyjna:

3.3. Implementacja iteracyjna:

3.4. Wizualizacja wstawiania:

Wstaw: [10, 5, 15, 3, 7]

Krok 1: Wstaw 10
    10

Krok 2: Wstaw 5 (5 < 10 → lewo)
    10
   /
  5

Krok 3: Wstaw 15 (15 > 10 → prawo)
    10
   /  \
  5    15

Krok 4: Wstaw 3 (3 < 10 → lewo, 3 < 5 → lewo)
      10
     /  \
    5    15
   /
  3

Krok 5: Wstaw 7 (7 < 10 → lewo, 7 > 5 → prawo)
      10
     /  \
    5    15
   / \
  3   7

4. Wyszukiwanie w BST

4.1. Algorytm:

  1. Porównaj z obecnym węzłem:
  2. Jeśli równy → znaleziono!
  3. Jeśli mniejszy → szukaj w lewym poddrzewie
  4. Jeśli większy → szukaj w prawym poddrzewie
  5. Powtarzaj

4.2. Implementacja rekurencyjna:

4.3. Implementacja iteracyjna:

4.4. Znajdowanie węzła:


5. Minimum i maksimum w BST

5.1. Minimum – najbardziej lewy węzeł:

5.2. Maksimum – najbardziej prawy węzeł:

5.3. Minimum/maksimum w poddrzewie:


6. Usuwanie z BST

6.1. Trzy przypadki:

Przypadek 1: Liść (bez dzieci)

      10              10
     /  \            /  \
    5    15    →    5    15
   / \             /
  3   7           3

Usuń 7 – po prostu usuń węzeł

Przypadek 2: Jeden potomek

      10              10
     /  \            /  \
    5    15    →    3    15
   /
  3

Usuń 5 – zastąp rodzicem dziecka (3)

Przypadek 3: Dwoje dzieci

      10              10
     /  \            /  \
    5    15    →    7    15
   / \   /         /     /
  3   7 12        3     12

Usuń 5 – zastąp następnikiem (7 = min z prawego poddrzewa)

6.2. Implementacja:

6.3. Alternatywna strategia – poprzednik:


7. Przechodzenie BST (In-Order)

In-order dla BST daje posortowaną kolejność!


8. Sprawdzanie poprawności BST


9. Wysokość BST


10. Zliczanie węzłów


11. Następnik i poprzednik

11.1. Następnik (successor):

11.2. Poprzednik (predecessor):


12. Zakres wartości (Range Query)


13. k-ty najmniejszy element


14. Złożoność operacji BST

14.1. Dla zbalansowanego BST:

Operacja Złożoność czasowa
Wyszukiwanie O(log n) ✅
Wstawianie O(log n) ✅
Usuwanie O(log n) ✅
Minimum/Max O(log n)
In-order O(n)

Wysokość: O(log n)

14.2. Dla zdegenerowanego BST (jak lista):

      10
       \
        15
         \
          20
           \
            25
Operacja Złożoność czasowa
Wyszukiwanie O(n) ❌
Wstawianie O(n) ❌
Usuwanie O(n) ❌

Wysokość: O(n) – jak lista!

14.3. Złożoność pamięciowa:

  • BST: O(n) – przechowuje n węzłów
  • Rekurencja: O(h) – głębokość stosu, gdzie h = wysokość

15. Wizualizacja BST

Wynik:

`-- 10
    |-- 5
    |   |-- 3
    |   |   |-- None
    |   |   `-- None
    |   `-- 7
    |       |-- None
    |       `-- None
    `-- 15
        |-- 12
        |   |-- None
        |   `-- None
        `-- 20
            |-- None
            `-- None

16. Zastosowania BST

16.1. Dynamiczny zbiór z szybkim wyszukiwaniem

16.2. Sortowanie (Tree Sort)

Złożoność: O(n log n) średnio, O(n²) najgorszy (zdegenerowane)

16.3. Słowniki i mapy


17. Porównanie z innymi strukturami

17.1. BST vs tablica posortowana:

Operacja BST (zbal.) Tablica posort.
Wyszukiwanie O(log n) O(log n) ✅
Wstawianie O(log n) ✅ O(n)
Usuwanie O(log n) ✅ O(n)
Min/Max O(log n) O(1) ✅

BST lepsze dla częstych wstawień/usunięć.

17.2. BST vs tablica haszująca:

Operacja BST (zbal.) Hash Table
Wyszukiwanie O(log n) O(1) ✅
Wstawianie O(log n) O(1) ✅
Usuwanie O(log n) O(1) ✅
Uporządkowanie TAK ✅ NIE
Range Query TAK ✅ NIE

BST lepsze gdy potrzebna jest kolejność lub zapytania zakresowe.


18. Podsumowanie

BST (Binary Search Tree):

  • Drzewo binarne z właściwością uporządkowania
  • Lewa < Środek < Prawa
  • Zbalansowane: O(log n) dla operacji ✅
  • Zdegenerowane: O(n) – jak lista ❌

Operacje:

Operacja Zbalansowane Zdegenerowane
Wyszukiwanie O(log n) ✅ O(n) ❌
Wstawianie O(log n) ✅ O(n) ❌
Usuwanie O(log n) ✅ O(n) ❌
Min/Max O(log n) O(n)
In-order O(n) O(n)

Zalety: - Efektywne wyszukiwanie/wstawianie/usuwanie (dla zbalansowanych) - In-order daje posortowaną kolejność ✅ - Dynamiczna struktura (elastyczny rozmiar) - Naturalne dla danych hierarchicznych

Wady: - Może zdegenerować do listy O(n) ❌ - Wymaga balansowania dla gwarantowanej wydajności - Bardziej złożone niż tablice - Większy narzut pamięci (wskaźniki)

Kiedy używać: - ✅ Częste wyszukiwania, wstawiania, usunięcia - ✅ Potrzebna jest kolejność (sortowanie) - ✅ Zapytania zakresowe (range queries) - ✅ Dynamiczny rozmiar danych

Kiedy NIE używać: - ❌ Dane niewielkie (tablica prostsza) - ❌ Tylko wyszukiwanie (tablica haszująca O(1)) - ❌ Brak gwarancji balansowania (użyj AVL/Red-Black)

Kluczowa obserwacja:

Co dalej warto poznać:

  • Przechodzenie drzew – in-order, pre-order, post-order, BFS
  • Drzewa AVL – samobalansujące BST, gwarantowane O(log n)
  • Drzewa Red-Black – alternatywne balansowanie
  • B-drzewa – dla baz danych i systemów plików
  • Kopce binarne – dla kolejek priorytetowych