Konstrukcja drzew binarnych

Wiemy, że dla w definicji pewnej klasy możemy zaimplementować dwa wskaźniki do obiektów tego samego typu. W ten sposób możemy stworzyć bardziej złożone struktury niż listy jednokierunkowe.

Dwukierunkowe listy tworzymy, gdy w obiekcie pewnej klasy zdefiniujemy wskaźnik do innego obiektu tego samego typu. Obiekty tego samego typu można łączyć w strukturę danych zwaną listą (zagadnienie to zostało omówione w e‑materiale Podstawowe struktury danych: listaPuhk7mD92Podstawowe struktury danych: lista).

W programowaniu w języku Python drzewo poszukiwań binarnychdrzewo binarnedrzewo poszukiwań binarnych realizuje się jako strukturę danych z dowiązaniami, w której każdy węzeł będzie obiektem o trzech polach:

  1. klucz – klucz węzła; przechowuje określoną wartość, np.  typu stałoprzecinkowego;

  2. lewy – odnośnik do lewego syna;

  3. prawy – odnośnik do prawego syna.

R164iPX4pQL8n
Konstrukcja drzewa binarnego
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Konstruktor klasy przyjmuje tylko wartość klucza.

Domyślnie atrybuty lewyprawy będą ustawione na None

W języku Python klasa Wezel będzie reprezentować węzeł drzewa.

Konstruktor klasy przyjmuje tylko tylko wartość klucza klucz typu int. Domyślnie atrybuty lewyprawy będą ustawione na None.

Linia 1. class Wezel dwukropek. Linia 2. def podkreślnik podkreślnik init podkreślnik podkreślnik otwórz nawias okrągły self przecinek klucz zamknij nawias okrągły dwukropek. Linia 3. self kropka klucz znak równości klucz. Linia 4. self kropka lewy znak równości None. Linia 5. self kropka prawy znak równości None.

Aby dodać pewien węzeł do drzewa binarnego, należy w polu lewy lub prawy już istniejącego węzła przypisać referencję do węzła, który chcemy dodać.

Linia 1. korzen znak równości Wezel otwórz nawias okrągły 6 zamknij nawias okrągły. Linia 2. korzen kropka lewy znak równości Wezel otwórz nawias okrągły 4 zamknij nawias okrągły. Linia 3. korzen kropka lewy kropka lewy znak równości Wezel otwórz nawias okrągły 1 zamknij nawias okrągły. Linia 4. korzen kropka prawy znak równości Wezel otwórz nawias okrągły 20 zamknij nawias okrągły. Linia 5. korzen kropka prawy kropka prawy znak równości Wezel otwórz nawias okrągły 22 zamknij nawias okrągły.

W celu zdefiniowania drzewa w języku Python zwykle stosuje się jedną zmienną korzen będącą referencją do korzenia drzewa. Z poziomu tej zmiennej możemy się dostać do dowolnego węzła w drzewie binarnym poprzez ciąg odwołań do synów korzenia.

Operacje na obiektach klasy Wezel wykonujemy poprzez tworzenie instancji tej klasy. Dostęp do pól obiektu uzyskujemy używając notacji kropkowej.

Linia 1. wezel znak równości Wezel otwórz nawias okrągły 5 zamknij nawias okrągły. Linia 2. print otwórz nawias okrągły wezel kropka klucz zamknij nawias okrągły.

Aby stworzyć reprezentację drzewa, które zostało zaprezentowane na ilustracji na początku e‑materiału, użyjemy klasy Wezel, utworzymy jej instancje dla każdego węzła i przypiszemy im odpowiednio lewe i prawe poddrzewa.

Linia 1. class Wezel dwukropek. Linia 2. def podkreślnik podkreślnik init podkreślnik podkreślnik otwórz nawias okrągły self przecinek klucz zamknij nawias okrągły dwukropek. Linia 3. self kropka klucz znak równości klucz. Linia 4. self kropka lewy znak równości None. Linia 5. self kropka prawy znak równości None. Linia 7. korzen znak równości Wezel otwórz nawias okrągły 6 zamknij nawias okrągły. Linia 8. korzen kropka lewy znak równości Wezel otwórz nawias okrągły 4 zamknij nawias okrągły. Linia 9. korzen kropka lewy kropka lewy znak równości Wezel otwórz nawias okrągły 1 zamknij nawias okrągły. Linia 10. korzen kropka prawy znak równości Wezel otwórz nawias okrągły 20 zamknij nawias okrągły. Linia 11. korzen kropka prawy kropka prawy znak równości Wezel otwórz nawias okrągły 22 zamknij nawias okrągły.

W zaprezentowanym kodzie tworzymy nowe węzły i przypisujemy im odpowiednio wartości klucza. Przypisujemy także węzły lewyprawy do każdego utworzonego węzła, aby odtworzyć strukturę drzewa z ilustracji.

Słownik

drzewo
drzewo

struktura danych, która reprezentuje drzewo matematyczne, w której występują wierzchołki, krawędzie, liście i korzeń

drzewo binarne
drzewo binarne

drzewo ukorzenione, w którym każdy węzeł ma najwyżej dwóch synów

korzeń
korzeń

węzeł (element) w drzewie, który nie ma żadnego rodzica; pierwszy element drzewa

lista jednokierunkowa
lista jednokierunkowa

dynamiczna struktura danych, która ma przechowywać nieznane z góry ilości danych tego samego typu; zbudowana jest z węzłów, z których każdy składa się z pojedynczego elementu przechowywanego w liście oraz wskaźnika do kolejnego elementu listy

liść
liść

węzeł (element) w drzewie, który nie ma żadnych następników (potomków); często liśćmi są węzły najbardziej oddalone od korzenia

referencja
referencja

zmienna za pomocą której program jest w stanie pobrać wartość bądź instancję znajdującą się w pamięci komputera; w języku Python każda zmienna jest referencją odwołująca się do pewnej wartości bądź instancji obiektu w pamięci; przypisując zmiennej inną zmienną, tak naprawdę przypisujemy odwołanie od pewnego miejsca w pamięci, do którego odwoływała się druga zmienna

wyciek pamięci (ang. memory leak)
wyciek pamięci (ang. memory leak)

część programu, która wykorzystuje zarezerwowaną pamięć bez jej ostatecznego zwalniania