Jaka jest najlepsza struktura danych, której można użyć do implementacji drzewa binarnego w Pythonie?
104
Jaka jest najlepsza struktura danych, której można użyć do implementacji drzewa binarnego w Pythonie?
Odpowiedzi:
Oto moja prosta rekurencyjna implementacja binarnego drzewa wyszukiwania.
źródło
node is not None
zamiast twojego(node!=None)
. Możesz także użyć tej__str__
funkcji zamiast metody printTree.def _find(self, val, node): if(val == node.v): return node elif(val < node.v and node.l != None): return self._find(val, node.l) elif(val > node.v and node.r != None): return self._find(val, node.r)
left<=root<=right
?Przeczytaj więcej na ten temat tutaj: -To jest bardzo prosta implementacja drzewa binarnego.
To jest fajny samouczek z pytaniami pomiędzy
źródło
insertLeft
jest zepsuty i utworzy nieskończoną pętlę przy każdej próbie rekurencyjnego przejścia w dół[Czego potrzebujesz do wywiadów] Klasa Node jest wystarczającą strukturą danych do reprezentowania drzewa binarnego.
(Podczas gdy inne odpowiedzi są w większości poprawne, nie są wymagane w przypadku drzewa binarnego: nie ma potrzeby rozszerzania klasy obiektów, nie trzeba być BST, nie ma potrzeby importowania deque).
Oto przykład drzewa:
W tym przykładzie n1 jest korzeniem drzewa mającego n2, n3 jako dzieci.
źródło
Prosta implementacja BST w Pythonie
źródło
Bardzo szybki i brudny sposób implementacji drzewa binarnego przy użyciu list. Nie jest najbardziej wydajny ani nie radzi sobie zbyt dobrze z wartościami zerowymi. Ale jest bardzo przejrzysty (przynajmniej dla mnie):
Konstruowanie drzewa z iterowalnego:
Przemierzanie drzewa:
źródło
Nie mogę nie zauważyć, że większość odpowiedzi tutaj zawiera implementację drzewa wyszukiwania binarnego. Drzewo wyszukiwania binarnego! = Drzewo binarne.
Drzewo wyszukiwania binarnego ma bardzo specyficzną właściwość: dla każdego węzła X klucz X jest większy niż klucz dowolnego potomka jego lewego dziecka i mniejszy niż klucz dowolnego potomka jego prawego dziecka.
Drzewo binarne nie nakłada takich ograniczeń. Drzewo binarne to po prostu struktura danych z elementem „kluczowym” i dwojgiem dzieci, powiedzmy „lewo” i „prawo”.
Drzewo to jeszcze bardziej ogólny przypadek drzewa binarnego, w którym każdy węzeł może mieć dowolną liczbę dzieci. Zazwyczaj każdy węzeł ma element „potomny”, który jest typu lista / tablica.
Teraz, aby odpowiedzieć na pytanie OP, dołączam pełną implementację drzewa binarnego w Pythonie. Podstawową strukturą danych przechowującą każdy BinaryTreeNode jest słownik, biorąc pod uwagę, że oferuje optymalne wyszukiwania O (1). Zaimplementowałem również przechodzenie najpierw w głąb i wszerz. Są to bardzo powszechne operacje wykonywane na drzewach.
źródło
nie musisz mieć dwóch zajęć
źródło
Trochę bardziej „Pythonic”?
źródło
źródło
Node
Klasa połączonych węzłów oparta na A to podejście standardowe. Trudno to sobie wyobrazić.Zmotywowani esejem na temat wzorców Pythona - implementowanie wykresów , rozważ prosty słownik:
Dany
Drzewo binarne
Kod
Utwórz słownik unikalnych węzłów:
Detale
find_all_paths()
).Funkcje oparte na drzewie często obejmują następujące typowe operacje:
Spróbuj wykonać wszystkie te operacje. Tutaj przedstawiamy jedną z tych funkcji - przechodzenie BFS:
Przykład
Jest to algorytm przeszukiwania wszerz (kolejność poziomów) stosowany do dyktowania węzłów i dzieci.
deque
, ale aqueue
lub alist
(to drugie jest nieefektywne).Zobacz także ten szczegółowy samouczek dotyczący drzew.
Wgląd
Coś wspaniałego w przeglądaniu w ogóle, możemy łatwo zmienić to drugie podejście iteracyjne do przeszukiwania najpierw w głąb (DFS) , po prostu zastępując kolejkę stosem (aka LIFO Queue). Oznacza to po prostu, że usuwamy z kolejki po tej samej stronie, po której umieszczamy kolejkę. DFS pozwala nam przeszukiwać każdą gałąź.
W jaki sposób? Ponieważ używamy a
deque
, możemy emulować stos, zmieniającnode = q.popleft()
nanode = q.pop()
(po prawej). Rezultatem jest prawo uprzywilejowanych, wstępnie zamówić DFS :['a', 'c', 'f', 'b', 'e', 'd']
.źródło
źródło
Ta implementacja obsługuje operacje wstawiania, znajdowania i usuwania bez niszczenia struktury drzewa. To nie jest bankierskie drzewo.
źródło
Wiem, że wiele dobrych rozwiązań zostało już opublikowanych, ale zwykle mam inne podejście do drzew binarnych: przejście z jakąś klasą Node i jej bezpośrednie wdrożenie jest bardziej czytelne, ale gdy masz dużo węzłów, może to stać się bardzo chciwe jeśli chodzi o pamięć, więc ja zasugeruj dodanie jednej warstwy złożoności i przechowywanie węzłów na liście w Pythonie, a następnie zasymulowanie zachowania drzewa przy użyciu samej listy.
Nadal możesz zdefiniować klasę Node, aby ostatecznie reprezentować węzły w drzewie, gdy jest to potrzebne, ale utrzymywanie ich w prostej formie [wartość, lewo, prawo] na liście zajmie połowę pamięci lub mniej!
Oto szybki przykład klasy Binary Search Tree przechowującej węzły w tablicy. Zapewnia podstawowe funkcje, takie jak dodawanie, usuwanie, znajdowanie ...
Dodałem atrybut rodzica, aby można było usunąć dowolny węzeł i zachować strukturę BST.
Przepraszamy za czytelność, zwłaszcza za funkcję „usuń”. Zasadniczo, gdy usuwany jest węzeł, otwieramy tablicę drzewa i zastępujemy ją ostatnim elementem (chyba że chcieliśmy usunąć ostatni węzeł). Aby zachować strukturę BST, usunięty węzeł jest zastępowany maksimum jego lewych elementów potomnych lub min jego prawych elementów potomnych i należy wykonać pewne operacje, aby indeksy były prawidłowe, ale jest wystarczająco szybki.
Użyłem tej techniki do bardziej zaawansowanych rzeczy, aby zbudować kilka dużych słowników słów z wewnętrzną metodą radix i byłem w stanie podzielić zużycie pamięci przez 7-8 (możesz zobaczyć przykład tutaj: https://gist.github.com/fbparis / b3ddd5673b603b42c880974b23db7cda )
źródło
Dobra implementacja binarnego drzewa wyszukiwania , zaczerpnięta stąd :
źródło
Chcę pokazać odmianę metody @ apadana, która jest bardziej przydatna, gdy istnieje znaczna liczba węzłów:
źródło
źródło
Drzewo binarne w Pythonie
źródło
Oto proste rozwiązanie, które można wykorzystać do zbudowania drzewa binarnego przy użyciu rekurencyjnego podejścia do wyświetlenia drzewa w kolejności, w której w poniższym kodzie użyto przemierzania.
Kod zaczerpnięty z: Binary Tree in Python
źródło