Jak mogę wydrukować drzewo binarne w Javie, aby wynik wyglądał następująco:
4
/ \
2 5
Mój węzeł:
public class Node<A extends Comparable> {
Node<A> left, right;
A data;
public Node(A data){
this.data = data;
}
}
java
printing
binary-tree
Tian
źródło
źródło
Odpowiedzi:
Stworzyłem prostą drukarkę drzew binarnych. Możesz go używać i modyfikować, jak chcesz, ale i tak nie jest zoptymalizowany. Myślę, że wiele rzeczy można tu poprawić;)
Wyjście 1:
Wyjście 2:
źródło
Wydrukuj [duże] drzewo wierszami.
przykład danych wyjściowych:
kod:
PS Ta odpowiedź nie skupia się dokładnie na drzewach „binarnych” - zamiast tego wypisuje wszystkie rodzaje drzew. Rozwiązanie jest inspirowane poleceniem "drzewo" w Linuksie.
źródło
children.get(children.size() - 1)
gdyby HashMap był używany dla dzieci? Udało mi się zmodyfikować każdą inną część oprócz tej.HashMap<String, List<String>>
?HashMap<String, Node>
. Ciąg to identyfikator węzła.W tym celu stworzyłem ulepszony algorytm, który ładnie obsługuje węzły o różnej wielkości. Drukuje od góry do dołu za pomocą linii.
Aby użyć tego dla swojego drzewa, pozwól swojej
Node
klasie zaimplementowaćPrintableNode
.Przykładowe dane wyjściowe:
źródło
???????????
zamiast linii między węzłami, ale powinien być tylko problem z funkcjami UTF8. W każdym razie, muszę przyznać, świetne rzeczy. Najlepsza odpowiedź dla mnie, ponieważ jest naprawdę łatwy w użyciu.public static <T> void print(T[] elems)
wydrukuje:
do wejścia
8 4 12 2 6 10 14 1 3 5 7 9 11 13 20 15
to jest wariant odpowiedzi @ anurag - niepokoił mnie widok dodatkowych | s
źródło
Zaczerpnięte z Wasia Novikov jest odpowiedzią aby uczynić go bardziej binarny i użyć
StringBuilder
do wydajności (łączenieString
przedmiotów razem w Javie jest zazwyczaj nieskuteczne).Wynik:
źródło
right != null
zrobiłem edycję i przetestowałem ją, działa dobrze.michal.kreuzman miły, muszę powiedzieć.
Byłem leniwy, kiedy sam tworzyłem program i szukałem kodu w sieci, gdy stwierdziłem, że to naprawdę mi pomogło.
Ale boję się zobaczyć, że działa tylko dla pojedynczych cyfr, tak jakbyś używał więcej niż jednej cyfry, ponieważ używasz spacji, a nie tabulatorów, struktura zostanie zgubiona, a program straci swoje zastosowanie.
Jeśli chodzi o moje późniejsze kody, potrzebowałem większych danych wejściowych (co najmniej więcej niż 10), ale to nie zadziałało, a po wielu przeszukiwaniu w sieci, gdy nic nie znalazłem, sam stworzyłem program.
Ma teraz kilka błędów, teraz znowu czuję się leniwy, aby je poprawić, ale drukuje bardzo pięknie, a węzły mogą przyjmować dowolną dużą wartość.
Drzewo nie będzie zgodne z pytaniem, ale jest obrócone o 270 stopni :)
Umieść tę funkcję we własnym określonym TreeNode i zachowaj początkowy poziom 0, i baw się!
Oto kilka przykładowych wyników:
Jedyny problem dotyczy rozszerzających się gałęzi; Postaram się jak najszybciej rozwiązać problem, ale do tego czasu Ty też możesz z niego korzystać.
źródło
Twoje drzewo będzie potrzebowało dwukrotnie większej odległości dla każdej warstwy:
Możesz zapisać swoje drzewo w szeregu tablic, po jednej dla każdej głębokości:
Jeśli twoje drzewo nie jest pełne, musisz uwzględnić puste wartości w tej tablicy:
Następnie możesz iterować po tablicy, aby wydrukować swoje drzewo, wypisując spacje przed pierwszym elementem i między elementami w zależności od głębokości i drukując wiersze w zależności od tego, czy odpowiednie elementy w tablicy dla następnej warstwy są wypełnione, czy nie. Jeśli wartości mogą mieć więcej niż jeden znak, musisz znaleźć najdłuższą wartość podczas tworzenia reprezentacji tablicowej i odpowiednio pomnożyć wszystkie szerokości i liczbę wierszy.
źródło
Uznałem, że odpowiedź VasyaNovikova jest bardzo przydatna przy drukowaniu dużego drzewa ogólnego i zmodyfikowałem ją na drzewo binarne
Kod:
Przykładowe dane wyjściowe:
źródło
Rozwiązanie w języku Scala , analogiczne do tego , co napisałem w Javie :
Przykład danych wyjściowych:
źródło
Wiem, że wszyscy macie świetne rozwiązanie; Chcę się tylko podzielić swoim - może to nie jest najlepszy sposób, ale dla mnie jest idealny!
Z włączonymi
python
ipip
włączonymi jest to naprawdę całkiem proste! BUM!Na Macu lub Ubuntu (mój to Mac)
$ pip install drawtree
$python
, wejdź do konsoli Pythona; możesz to zrobić w inny sposóbfrom drawtree import draw_level_order
draw_level_order('{2,1,3,0,7,9,1,2,#,1,0,#,#,8,8,#,#,#,#,7}')
GOTOWE!
Śledzenie źródła:
Zanim zobaczyłem ten post, przeszedłem do Google „zwykły tekst drzewa binarnego”
I znalazłem to https://www.reddit.com/r/learnpython/comments/3naiq8/draw_binary_tree_in_plain_text/ , skieruj mnie do tego https://github.com/msbanik/drawtree
źródło
java
, jak oczekuje odpowiedzi w Javie :)źródło
To bardzo proste rozwiązanie, aby wydrukować drzewo. To nie jest takie ładne, ale jest naprawdę proste:
Przykładowe dane wyjściowe:
źródło
Na podstawie odpowiedzi VasyaNovikov. Ulepszono dzięki pewnym magiom Java: interfejsom generycznym i funkcjonalnym.
Przykładowe pierwsze wezwanie:
Wyświetli coś takiego
źródło
Napisałem binarną drukarkę drzew w Javie.
Kod jest na GitHub tutaj .
Nie został zoptymalizowany pod kątem wydajności w czasie wykonywania, ale ponieważ mówimy o drukowaniu w ASCII, pomyślałem, że nie będzie on używany na bardzo dużych drzewach. Ma jednak kilka fajnych funkcji.
Niektóre programy demonstracyjne / testowe są dołączone.
Poniżej przedstawiono przykład losowo wygenerowanego drzewa binarnego, wydrukowanego przez program. To ilustruje efektywne wykorzystanie przestrzeni, z dużym prawym poddrzewem rozciągającym się pod małym lewym poddrzewem:
Przykład drukowania wszystkich pięciu drzew binarnych węzłów (z etykietami w kolejności) na stronie:
Poniżej znajduje się przykład tego samego drzewa wydrukowanego na 4 różne sposoby, z poziomymi odstępami 1 i 3 oraz z gałęziami ukośnymi i poziomymi.
źródło
@Makyen
komentarz.To ciekawe pytanie, do którego napisałem również projekt.
drukarka-drzewa-binarnego
Oto kilka przykładów:
Wydrukuj losowy BST.
Wydrukuj drzewo z tablicy kolejności poziomu w stylu kodu kodu, „#” oznacza terminator ścieżki, w którym poniżej nie ma węzła.
źródło
Musiałem wydrukować drzewo binarne w jednym z moich projektów, w tym celu przygotowałem klasę java
TreePrinter
, jednym z przykładowych wyników jest:Oto kod klasy
TreePrinter
wraz z klasąTextNode
. Aby wydrukować dowolne drzewo, możesz po prostu utworzyć równoważne drzewo zTextNode
klasą.Na koniec mamy klasę testową do drukowania danej próbki:
źródło
Możesz użyć apletu, aby bardzo łatwo to zwizualizować. Musisz wydrukować następujące elementy.
Wydrukuj węzły jako okręgi z widocznym promieniem
Uzyskaj współrzędne dla każdego węzła.
Współrzędna x może być wizualizowana jako liczba węzłów odwiedzonych przed odwiedzeniem węzła w trakcie przechodzenia w kolejności.
Współrzędną y można wizualizować jako głębokość określonego węzła.
Wydrukuj linie między rodzicem a dziećmi
Można to zrobić, utrzymując współrzędne x i y węzłów i rodziców każdego węzła na osobnych listach.
Dla każdego węzła oprócz głównego dołącz każdy węzeł do jego rodzica, biorąc współrzędne x i y zarówno dziecka, jak i rodzica.
źródło
https://github.com/murtraja/java-binary-tree-printer
działa tylko dla liczb całkowitych od 1 do 2 cyfr (byłem leniwy, aby uczynić go ogólnym)
źródło
To było najprostsze rozwiązanie dla widoku poziomego. Próbowałem z wieloma przykładami. Działa dobrze w moim przypadku. Zaktualizowano z odpowiedzi @ nitin-k.
Połączenie:
Rozwiązanie:
źródło
node_length * nodes_count + space_length * spaces_count*
.Kod w serwisie GitHub: YoussefRaafatNasry / bst-ascii-visualization
źródło
visualize
funkcja, to całavisualizer
klasa, która zawiera około 200 loc, łącznie z plikiem nagłówkowym.Dla tych, którzy szukają rozwiązania Rust:
Wynik wygląda mniej więcej tak:
źródło
Drukuj w konsoli:
Prosty kod:
źródło
Oto bardzo wszechstronna drukarka drzewek. Nie najlepiej wygląda, ale radzi sobie z wieloma sprawami. Jeśli możesz to rozgryźć, możesz dodać ukośniki.
Klasa NodeInfo
Klasa NodePosition
I na koniec Node Interface
źródło
Rozwiązanie Scala, zaadaptowane z odpowiedzi Vasyi Novikov i specjalizujące się w drzewach binarnych:
źródło
Zobacz także te odpowiedzi .
W szczególności nie było zbyt trudne użycie abego TreeLayout do uzyskania wyników pokazanych poniżej przy domyślnych ustawieniach.
Jeśli wypróbujesz to narzędzie, zwróć uwagę na to zastrzeżenie: drukuje ono dzieci w kolejności, w jakiej zostały dodane. W przypadku BST, w którym liczy się lewa vs prawa, uznałem tę bibliotekę za nieodpowiednią bez modyfikacji.
Ponadto metoda dodawania dzieci po prostu przyjmuje jako parametry węzeł
parent
ichild
. (Aby przetworzyć kilka węzłów, musisz osobno pobrać pierwszy z nich, aby utworzyć root).Skończyło się na tym , że użyłem tego rozwiązania powyżej, modyfikując je tak, aby przyjmowało typ
<Node>
, aby mieć dostęp doNode
lewej i prawej strony (dzieci).źródło
Oto inny sposób wizualizacji drzewa: zapisz węzły jako plik xml, a następnie pozwól przeglądarce pokazać Ci hierarchię:
Oto kod do przetestowania:
Wynik wygląda następująco:
źródło
źródło
jest to jedna z najprostszych wersji, jaką mogłem wdrożyć. Mam nadzieję, że Ci to pomoże
źródło