Menu
Coddy logo textTech

Drzewo binarne

Ostatnia aktualizacja

Drzewo binarne to hierarchia, w której każdy węzeł ma najwyżej dwoje dzieci, nazywanych lewym i prawym dzieckiem. Najwyższy węzeł to korzeń, węzły bez dzieci to liście, a liczba krawędzi od korzenia do najgłębszego liścia to wysokość drzewa. W przeciwieństwie do binarnego drzewa poszukiwań zwykłe drzewo binarne nie ma reguły porządku: to sam kształt. Kliknij odtwarzanie powyżej i zobacz, jak drzewo wypełnia się poziom po poziomie, a potem jest przechodzone in-order (lewe, węzeł, prawe).

Drzewa binarne są podstawą wielu struktur: binarnych drzew poszukiwań, kopców, drzew wyrażeń i innych. Przejścia odwiedzają każdy węzeł w określonej kolejności: in-order, pre-order i post-order to trzy przejścia w głąb, a każde przydaje się do innych zadań.

Pojęcia

PojęcieZnaczenie
KorzeńNajwyższy węzeł, bez rodzica
LiśćWęzeł bez dzieci
WysokośćNajdłuższa ścieżka od korzenia do liścia (w krawędziach)
GłębokośćOdległość węzła od korzenia
ZupełneWszystkie poziomy pełne, z wyjątkiem być może ostatniego, wypełnianego od lewej do prawej

Trzy przejścia w głąb

PrzejścieKolejnośćTypowe zastosowanie
In-orderLewe, węzeł, prawePosortowany wynik z drzewa BST
Pre-orderWęzeł, lewe, praweKopiowanie / serializacja drzewa
Post-orderLewe, prawe, węzełUsuwanie / obliczanie drzewa

Przykład krok po kroku

Przejście in-order drzewa zbudowanego z [4, 2, 6, 1, 3, 5] (wypełnianego poziom po poziomie):

KrokW węźleDziałanie
14Zejdź rekurencyjnie do lewego poddrzewa 4, zanim go odwiedzisz
22Zejdź rekurencyjnie do lewego poddrzewa 2, zanim go odwiedzisz
31Liść, brak lewego dziecka: odwiedź 1, wynik [1]
42Lewa strona gotowa: odwiedź 2, wynik [1, 2], potem zejdź w prawo
53Liść: odwiedź 3, wynik [1, 2, 3]
64Lewe poddrzewo gotowe: odwiedź 4, wynik [1, 2, 3, 4], potem zejdź w prawo
75Lewe dziecko 6, liść: odwiedź 5, wynik [1, 2, 3, 4, 5]
86Lewa strona gotowa, brak prawego dziecka: odwiedź 6, wynik [1, 2, 3, 4, 5, 6]

Kiedy używać drzewa binarnego

Używaj, gdyUnikaj, gdy
Musisz modelować dane z natury hierarchiczne (systemy plików, drzewa wyrażeń, DOM)Dane są płaskie i wystarczy lista lub tablica: drzewo dodaje tylko narzut
Chcesz operacji na uporządkowanych danych i możesz utrzymać równowagę (BST lub drzewo samorównoważące się)Potrzebujesz średnio O(1) na wyszukiwanie po kluczu: tablica haszująca pokonuje każde drzewo
Potrzebujesz przetwarzania danych strukturalnych w kolejności in-order, pre-order lub post-orderWęzły są wstawiane w posortowanej kolejności do niezrównoważonego drzewa BST: degraduje się ono do listy O(n)
Liczą się zapytania o zakres lub iteracja w porządku, których tablice haszujące nie zapewniająPamięci jest mało: każdy węzeł przechowuje dwa wskaźniki na dzieci oraz dane

Binary Tree: kod

Przejrzysta, gotowa do uruchomienia implementacja algorytmu Binary 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 Tree: kod (Python)

Python
1from collections import deque2
3
4class Node:5    def __init__(self, value):6        self.value = value7        self.left = None8        self.right = None9
10
11def insert(root, value):12    # Level-order insert: fill the first empty child slot found13    if root is None:14        return Node(value)15    queue = deque([root])16    while queue:17        node = queue.popleft()18        if node.left is None:19            node.left = Node(value)20            return root21        queue.append(node.left)22        if node.right is None:23            node.right = Node(value)24            return root25        queue.append(node.right)26
27
28def inorder(node):29    if node is None:30        return []31    return inorder(node.left) + [node.value] + inorder(node.right)32
33
34root = None35for value in [1, 2, 3, 4, 5, 6, 7]:36    root = insert(root, value)37
38print("Root:   ", root.value)39print("Inorder:", inorder(root))
Uruchom ten kod w edytorze Python online

Drzewo binarne: najczęstsze pytania

Czym różni się drzewo binarne od binarnego drzewa poszukiwań?
Drzewo binarne po prostu ogranicza każdy węzeł do najwyżej dwojga dzieci, bez żadnego porządku. Binarne drzewo poszukiwań dodaje regułę, że wszystko w lewym poddrzewie jest mniejsze, a wszystko w prawym większe, i właśnie to przyspiesza wyszukiwanie.
Czym jest przejście in-order?
Przejście in-order odwiedza rekurencyjnie lewe poddrzewo, potem węzeł, a potem prawe poddrzewo. W binarnym drzewie poszukiwań zwraca wartości posortowane rosnąco, dlatego jest to najczęściej prezentowane przejście.
Czym jest zupełne drzewo binarne?
Zupełne drzewo binarne ma każdy poziom całkowicie wypełniony, z wyjątkiem być może ostatniego, który jest wypełniany od lewej do prawej. Taki kształt pozwala zwięźle przechowywać drzewo w tablicy (bez wskaźników na dzieci) i właśnie tak implementuje się kopce binarne.
Kiedy użyć drzewa binarnego zamiast tablicy lub tablicy haszującej?
Sięgnij po drzewo, gdy dane są naturalnie hierarchiczne albo gdy potrzebujesz operacji na uporządkowanych danych, takich jak zapytania o zakres i iteracja w porządku, których tablice haszujące nie dają. Jeśli potrzebujesz tylko szybkiego wyszukiwania po kluczu bez porządku, średni dostęp O(1) tablicy haszującej pokonuje drzewo, a dla płaskich danych zwykła tablica jest prostsza i lepiej współpracuje z pamięcią podręczną.
Czym różni się wysokość od głębokości drzewa binarnego?
Głębokość mierzy się od korzenia w dół do konkretnego węzła: to liczba krawędzi na ścieżce od korzenia do tego węzła. Wysokość mierzy się od węzła w dół do jego najgłębszego liścia, więc wysokość całego drzewa to głębokość jego najgłębszego węzła. Drzewo z jednym węzłem ma wysokość 0, a jego jedyny węzeł ma też głębokość 0.
Dlaczego niezrównoważone drzewo binarne działa tak słabo?
Wyszukiwanie, wstawianie i usuwanie w binarnym drzewie poszukiwań kosztują O(h), gdzie h to wysokość. Gdy klucze są wstawiane w posortowanej kolejności, drzewo staje się prostą linią, więc h rośnie do n, a każda operacja degraduje się do O(n), czyli nie lepiej niż lista jednokierunkowa. Drzewa samorównoważące się, takie jak AVL czy czerwono-czarne, utrzymują wysokość O(log n), aby temu zapobiec.
Ilustracja języków programowania w Coddy

Opanuj algorytmy z Coddy

ZACZNIJ