Wie kann ich einen Binärbaum in Java drucken, damit die Ausgabe wie folgt aussieht:
4
/ \
2 5
Mein Knoten:
public class Node<A extends Comparable> {
Node<A> left, right;
A data;
public Node(A data){
this.data = data;
}
}
java
printing
binary-tree
Tian
quelle
quelle
Antworten:
Ich habe einen einfachen Binärbaumdrucker erstellt. Sie können es verwenden und ändern, wie Sie möchten, aber es ist trotzdem nicht optimiert. Ich denke, dass hier viele Dinge verbessert werden können;)
Ausgabe 1:
Ausgabe 2:
quelle
Drucken Sie einen [großen] Baum zeilenweise.
Ausgabebeispiel:
Code:
PS Diese Antwort konzentriert sich nicht genau auf "binäre" Bäume, sondern druckt alle Arten von Bäumen. Die Lösung ist vom Befehl "tree" unter Linux inspiriert.
quelle
children.get(children.size() - 1)
wenn HashMap für Kinder verwendet würde? Ich habe es geschafft, jeden anderen Teil außer diesem zu modifizieren.HashMap<String, List<String>>
?HashMap<String, Node>
. String ist die ID des Knotens.Ich habe dafür einen verbesserten Algorithmus entwickelt, der gut mit Knoten unterschiedlicher Größe umgeht. Es druckt von oben nach unten mit Linien.
Um dies für Ihren Baum zu verwenden, lassen Sie Ihre
Node
Klasse implementierenPrintableNode
.Beispielausgabe:
quelle
???????????
anstelle der Linien zwischen Knoten aber sollte nur ein UTF8 ans Zeug Problem sein. Wie auch immer, großartiges Zeug, muss ich sagen. Beste Antwort für mich, da es sehr einfach zu bedienen ist.public static <T> void print(T[] elems)
wird drucken:
für die Eingabe
8 4 12 2 6 10 14 1 3 5 7 9 11 13 20 15
Dies ist eine Variante von @ anurags Antwort - es hat mich nervt, die Extras zu sehen
quelle
Angepasst an die Antwort von Vasya Novikov , um sie binärer zu gestalten und eine aus Effizienzgründen zu verwenden (das Verketten von Objekten in Java ist im Allgemeinen ineffizient).
StringBuilder
String
Ausgabe:
quelle
right != null
.Ich habe ihn bearbeitet und getestet, er funktioniert einwandfrei.michal.kreuzman schön, muss ich sagen.
Ich war faul, selbst ein Programm zu erstellen und im Internet nach Code zu suchen, als ich das fand, das mir wirklich geholfen hat.
Aber ich habe Angst zu sehen, dass es nur für einzelne Ziffern funktioniert, als ob Sie mehr als eine Ziffer verwenden würden, da Sie Leerzeichen und keine Tabulatoren verwenden, wird die Struktur verlegt und das Programm verliert seine Verwendung.
Für meine späteren Codes brauchte ich einige größere Eingaben (mindestens mehr als 10), was für mich nicht funktionierte, und nachdem ich viel im Netz gesucht hatte, als ich nichts gefunden hatte, machte ich selbst ein Programm.
Es hat jetzt einige Fehler, wieder im Moment fühle ich mich faul, sie zu korrigieren, aber es druckt das sehr schön und die Knoten können jeden großen Wert annehmen.
Der Baum wird nicht so sein, wie die Frage erwähnt, aber er ist um 270 Grad gedreht :)
Platzieren Sie diese Funktion mit Ihrem eigenen angegebenen TreeNode und behalten Sie den Level anfangs bei 0 und genießen Sie!
Hier sind einige der Beispielausgaben:
Das einzige Problem ist mit den sich erstreckenden Zweigen; Ich werde versuchen, das Problem so schnell wie möglich zu lösen, aber bis dahin können Sie es auch verwenden.
quelle
Ihr Baum benötigt für jede Schicht den doppelten Abstand:
Sie können Ihren Baum in einem Array von Arrays speichern, einem Array für jede Tiefe:
Wenn Ihr Baum nicht voll ist, müssen Sie leere Werte in dieses Array aufnehmen:
Anschließend können Sie über das Array iterieren, um Ihren Baum zu drucken. Dabei werden Leerzeichen vor dem ersten Element und zwischen den Elementen je nach Tiefe gedruckt und die Zeilen gedruckt, je nachdem, ob die entsprechenden Elemente im Array für die nächste Ebene gefüllt sind oder nicht. Wenn Ihre Werte mehr als ein Zeichen lang sein können, müssen Sie beim Erstellen der Array-Darstellung den längsten Wert finden und alle Breiten und die Anzahl der Zeilen entsprechend multiplizieren.
quelle
Ich fand die Antwort von VasyaNovikov sehr nützlich, um einen großen allgemeinen Baum zu drucken, und modifizierte ihn für einen binären Baum
Code:
Beispielausgabe:
quelle
Eine Lösung in Scala- Sprache, analog zu dem, was ich in Java geschrieben habe :
Ausgabebeispiel:
quelle
Ich weiß, dass ihr alle eine großartige Lösung habt. Ich möchte nur meine teilen - vielleicht ist das nicht der beste Weg, aber es ist perfekt für mich!
Mit
python
undpip
weiter ist es wirklich ganz einfach! BOOM!Auf Mac oder Ubuntu (meins ist Mac)
$ pip install drawtree
$python
Geben Sie die Python-Konsole ein. Sie können es auf andere Weise tunfrom drawtree import draw_level_order
draw_level_order('{2,1,3,0,7,9,1,2,#,1,0,#,#,8,8,#,#,#,#,7}')
GETAN!
Quellenverfolgung:
Bevor ich diesen Beitrag sah, ging ich auf Google "Binärbaum Klartext"
Und ich fand diese https://www.reddit.com/r/learnpython/comments/3naiq8/draw_binary_tree_in_plain_text/ , leiten Sie mich zu dieser https://github.com/msbanik/drawtree
quelle
java
er eine Java-Antwort erwartet :)quelle
Dies ist eine sehr einfache Lösung, um einen Baum auszudrucken. Es ist nicht so hübsch, aber es ist wirklich einfach:
Beispielausgabe:
quelle
Basierend auf der Antwort von VasyaNovikov. Verbessert mit etwas Java-Magie: Generics and Functional Interface.
Beispiel für einen ersten Anruf:
Gibt so etwas aus
quelle
Ich habe einen Binärbaumdrucker in Java geschrieben.
Code ist hier auf GitHub .
Es wurde nicht für die Laufzeiteffizienz optimiert, aber da wir über das Drucken in ASCII sprechen, dachte ich, dass es nicht für sehr große Bäume verwendet werden wird. Es hat jedoch einige nette Funktionen.
Einige Demo- / Testprogramme sind enthalten.
Es folgt ein Beispiel eines zufällig generierten Binärbaums, wie er vom Programm gedruckt wird. Dies zeigt die effiziente Raumnutzung mit einem großen rechten Teilbaum, der sich unter einem kleinen linken Teilbaum erstreckt:
Ein Beispiel für das Drucken aller fünf Knoten-Binärbäume (mit Beschriftungen in der richtigen Reihenfolge) auf der Seite:
Das Folgende ist ein Beispiel für denselben Baum, der auf 4 verschiedene Arten gedruckt wurde, mit einem horizontalen Abstand von 1 und 3 und mit diagonalen und horizontalen Zweigen.
quelle
@Makyen
in einen Kommentar aufnehmen.Dies ist eine interessante Frage, und ich habe auch ein Projekt dafür geschrieben.
Binärbaumdrucker
Hier sind einige Beispiele:
Zufällige BST drucken.
'#' Bedeutet einen Pfadabschluss, bei dem unten kein Knoten vorhanden ist.
quelle
Ich musste in einem meiner Projekte einen Binärbaum drucken. Dafür habe ich eine Java-Klasse vorbereitet. Eine
TreePrinter
der Beispielausgaben lautet:Hier ist der Code für die Klasse
TreePrinter
zusammen mit der KlasseTextNode
. Zum Drucken eines beliebigen Baums können Sie einfach einen entsprechenden Baum mitTextNode
Klasse erstellen .Schließlich ist hier eine Testklasse zum Drucken eines bestimmten Musters:
quelle
Sie können ein Applet verwenden, um dies sehr einfach zu visualisieren. Sie müssen die folgenden Elemente drucken.
Drucken Sie die Knoten als Kreise mit einem sichtbaren Radius
Holen Sie sich die Koordinaten für jeden Knoten.
Die x-Koordinate kann als die Anzahl der besuchten Knoten visualisiert werden, bevor der Knoten in seiner Inorder Traversal besucht wird.
Die y-Koordinate kann als Tiefe des jeweiligen Knotens dargestellt werden.
Drucken Sie die Zeilen zwischen Eltern und Kindern
Dies kann erreicht werden, indem die x- und y-Koordinaten der Knoten und der Eltern jedes Knotens in separaten Listen verwaltet werden.
Verbinden Sie für jeden Knoten außer root jeden Knoten mit seinem übergeordneten Knoten, indem Sie die x- und y-Koordinaten sowohl des untergeordneten als auch des übergeordneten Knotens verwenden.
quelle
https://github.com/murtraja/java-binary-tree-printer
funktioniert nur für 1 bis 2-stellige Ganzzahlen (ich war faul, es generisch zu machen)
quelle
Dies war die einfachste Lösung für die horizontale Ansicht. Versucht mit einer Reihe von Beispielen. Funktioniert gut für meinen Zweck. Aktualisiert von der Antwort von @ nitin-k.
Anruf:
Lösung:
quelle
node_length * nodes_count + space_length * spaces_count*
.Code auf GitHub: YoussefRaafatNasry / bst-ascii-visualization
quelle
visualize
Funktion, sondern die gesamtevisualizer
Klasse mit etwa 200 Loc einschließlich der Header-Datei.Für diejenigen, die nach einer Rostlösung suchen:
Die Ausgabe ist ungefähr so:
quelle
In Konsole drucken:
Einfacher Code:
quelle
Hier ist ein sehr vielseitiger Baumdrucker. Nicht das beste Aussehen, aber es behandelt viele Fälle. Fühlen Sie sich frei, Schrägstriche hinzuzufügen, wenn Sie das herausfinden können.
NodeInfo-Klasse
NodePosition-Klasse
Und schließlich Node Interface
quelle
Eine Scala-Lösung, angepasst an Vasya Novikovs Antwort und spezialisiert auf binäre Bäume:
quelle
Siehe auch diese Antworten .
Insbesondere war es nicht allzu schwierig, abego TreeLayout zu verwenden zu verwenden, um die unten gezeigten Ergebnisse mit den Standardeinstellungen zu erzielen.
Wenn Sie dieses Tool ausprobieren, beachten Sie diese Einschränkung: Es druckt untergeordnete Elemente in der Reihenfolge, in der sie hinzugefügt wurden. Für eine BST, bei der Links gegen Rechts wichtig sind, fand ich diese Bibliothek ohne Änderung unangemessen.
Bei der Methode zum Hinzufügen von untergeordneten Elementen werden einfach ein
parent
und einchild
Knoten als Parameter verwendet. (Um eine Reihe von Knoten zu verarbeiten, müssen Sie den ersten separat verwenden, um eine Wurzel zu erstellen.)Am Ende habe ich diese Lösung oben verwendet und sie so geändert, dass sie den Typ
<Node>
annimmt, um Zugriff aufNode
links und rechts (Kinder) zu haben.quelle
Hier ist eine andere Möglichkeit, Ihren Baum zu visualisieren: Speichern Sie die Knoten als XML-Datei und lassen Sie sich dann von Ihrem Browser die Hierarchie anzeigen:
Hier ist Code zum Testen:
Und die Ausgabe sieht so aus:
quelle
quelle
Dies ist eine der einfachsten Versionen, die ich implementieren könnte. Ich hoffe es hilft dir
quelle