Fragen zur Implementierung eines Binärbaums

SmittyJoe

Mitglied
Ich habe die Aufgabe gehabt einen Binärbaum zu implementieren, bestehend aus einem Konstruktor sowie einer get- und insert-Methode. Der erste Versuch, obwohl ich im Theorieteil etwas hinke:

Klassendiagramm:

classdiagrammt6lphoygm9_thumb.jpg


Implementierung:

Java:
public class BinaryTree {
	private Node root = null;

	private static class Node {
		private Integer key;
		private String value;
		private Node left = null;
		private Node right = null;

		public Node(Integer key, String value) {
			this.key = key;
			this.value = value;
		}
	}

	public boolean insert(Integer key, String value) {
		if (root == null) {
			root = new Node(key, value);
			return true;
		} else {
			return insert(root, key, value);
		}
	}

	private boolean insert(Node node, Integer key, String value) {
		if (key.equals(node.key)) {
			// falls doppelter Knoten
			return false;
		} else if (key < node.key) {
			if (node.left == null) {
				node.left = new Node(key, value);
				return true;
			} else {
				return insert(node.left, key, value);
			}
		} else if (key > node.key) {
			if (node.right == null) {
				node.right = new Node(key, value);
				return true;
			} else {
				return insert(node.right, key, value);
			}
		}
		return false;
	}

	public String get(Integer key) {
		return get(root, key); // Start der Suche bei der Wurzel
	}

	public String get(Node node, Integer key) {
		String result = null; 
                if (node.key.equals(key)) { 
			return node.value;
		} else {
			if (key < node.key && node.left != null) {
														
				result = get(node.left, key);
			} else if (key > node.key && node.right != null) { 
																

				result = get(node.right, key);
			}
		}

		return result;
	}

Beschreibung der Methoden:

get: Die get-Methode startet in einem bestimmten Knoten innerhalb des Baumes und überprüft ob der Knoten selbst das Kriterium erfüllt. Falls ja, gibt er den Inhalt des Knoten wieder, falls nicht durch die Baumstruktur durch auf der Suche eines passenden Knotens.

insert: Falls keine Wurzel im Baum exisiert, füge eine Wurzel ein. Anderenfalls füge einen Wurzelknoten einen Wert hinzu. Falls man einem Knoten einem Wert hinzufügt, beginnend von der Wurzel, wird geschaut, ob der Schlüsselwert(Key) kleiner,gleich oder größer als dem hinzugefügten Schlüsselwert ist. Bei gleicher Größe wird nicht weiter forgeführt, falls kleiner oder größer werden neue Knoten erzeugt.

1.Sollen die Klassen separiert werden(BinaryTree,Node,Nutzerklasse) oder geht diese Form in Ordnung?
2.Wie könnte eine Nutzerklasse(Main) aussehen, ich stelle mir vor ein Objekt zu erzeugen,dann mit Hilfe der insert-Methode die Elemente einzufügen und dann über die get-Methode wieder auszugeben.

Falls mir noch Fragen einfallen, stelle ich sie hier :)

Danke schonmal im Vorraus!
 

DarXun

Aktives Mitglied
Guten Abend SmittyJoe

zu 1.

Eigentlich hätte ich gesagt, dass es voll okay ist Node als innere Klasse zu definieren. Die get- und insert-Methoden, die mit 'Node' als Parameter arbeiten, sind jedoch beide public. Damit müsste Node also von "außen" verfügbar sein. Wenn die angesprochenen Methoden jedoch 'private' wären, dann gäbe es von außen keine Schnittstelle in der die Klasse 'Node' benötigt würde. Eine innere Klasse wäre in diesem Beispiel damit durchaus sinnvoll.

Eine 'main'-Methode (von dir als Nutzerklasse dargestellt) schreibe ich grundsätzlich in eine separate Klasse. Aus meinem Verständnis der Objektorientierung macht das nur Sinn, da jede Klasse nur eine Zuständigkeit haben sollte (mir fehlt hier gerade der Fachbegriff). Die 'BinaryTree'-Klasse sollte nur für die Verwaltung/Behandlung eines Binärbaums zuständig sein. Eine Main-Methode stellt dann ja eher eine Anwendung dieser Klasse dar und würde somit in einen anderen Zuständigkeitsbereich fallen.

zu 2.

Hört sich gut an. Würde ich vermutlich auch so machen.

Mit freundlichen Grüßen

DarXun
 

SmittyJoe

Mitglied
Danke für die Rückmeldung. Die Idee für die Main-Funktion wäre ungefähr so:

Java:
public class BinaryTreeUser {
	public static void main(String args[]) {
		BinaryTree bt = new BinaryTree();
...
}

Dann sowas wie

Java:
bt.insert(new Node(4,"String"));

wobei ich hier an zwei Punkten hänge, a) ob korrekter ein neuer Knoten zu erzeugen ist und b) warum bei Node hier Eclipse rumzickt. Vielleicht wegen der Sichtbarkeit in der BinaryTree-Klasse?!

Dann kommt in meinen Gedanken eine große Lücke, einzig und alleine die get-Methode in Form von

Java:
bt.get(1);

kommt mir in den Sinn. Mir kommen in den Sinn for-Schleifen,foreach-Schleife,etc. Aber kein komplettes Konstrukt. Würde sehr gerne meine BinaryTree-Klasse testen können, um zu schauen, ob es richtig arbeiten tut.
 

DarXun

Aktives Mitglied
b) warum bei Node hier Eclipse rumzickt. Vielleicht wegen der Sichtbarkeit in der BinaryTree-Klasse?!

Jop. Hatte ich auch in meinem Posting schon erwähnt.
Die Node brauchst du nach außen hin ja auch gar nicht.
Mach einfach mal die get- und insert-Methoden die als Parameter unter anderem ein Node-Objekt bekommen private.
Die Zugriffe funktionieren damit von außen komplett ohne Node. Ein Nutzer der BinaryTree-Klasse muss ja auch garnicht wissen wie du intern arbeitest, ihn interessiert nur, dass er einen Binärbaum verwenden kann.

Zum "testen":
Überlege dir mal welche verschiedenen Szenarien es gibt, wie dein Baum aufgebaut werden kann.
Ein Baum könnte z.B. nur aus einem Blatt bestehen.
Ein andere Baum könnte nur ein Zweig mit einem Blatt beinhalten (einmal links, einmal rechts).
Oder was passiert, wenn versuchst ein vorhandenen Key nochmal zu verwenden (es gibt also nicht nur Varianten deren Funktionsweise du über die Nutzung von 'get' überprüfen kannst).

Die korrekte Befüllung der verschiedenen Bäume lässt sich hier, soweit ich das sehe, anhand der get-Methode nur schlecht erkennen. Per 'get' kannst du nur sehen ob ein Element eingefügt wurde, nicht aber an welcher Stelle es eingefügt wurde. Hier würde es sich anbieten, sich erstmal einfach durchzudebuggen.
Wenn du deine get-Methode etwas anpasst, dann könntest du natürlich nicht nur den Wert des gesuchten Elements ausgeben lassen, sondern den gesamten Weg dahin. Damit würde sich sicherlich einiges mehr erkennen lassen.

Ich hoffe ich konnte helfen.

Mit freundlichen Grüßen

DarXun
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Fragen zur Implementierung eines Adressbuches Java Basics - Anfänger-Themen 20
Zrebna Fragen zu einem Klassendiagramm Java Basics - Anfänger-Themen 8
H Fragen zu Wrapperklassen Java Basics - Anfänger-Themen 29
S Best Practice Fragen zu Projektstruktur einer Datenbank-Abfrage-App (MVC) Java Basics - Anfänger-Themen 13
A Bei VierGewinnt fragen ob man gegen CPU oder Menschen spielen will. Java Basics - Anfänger-Themen 7
A Bei VierGewinnt vorher fragen, ob man gegen den Computer spielen möchte oder gegeneinander. Java Basics - Anfänger-Themen 1
A Bei VierGewinnt fragen, ob man gegen den Computer spielen möchte oder gegeneinander Java Basics - Anfänger-Themen 1
sserio Wie kann man nach einer Klasse fragen? Java Basics - Anfänger-Themen 12
G Fragen zu Kompelierfehler in Aufgabe. Java Basics - Anfänger-Themen 25
E Bäume/ allgemeine Fragen Java Basics - Anfänger-Themen 21
O Falsche Antworten zu Fragen Java Basics - Anfänger-Themen 4
S Diverse Fragen vor Schulaufgabe ;) Java Basics - Anfänger-Themen 4
S Fragen zu Ausgabe double und float Java Basics - Anfänger-Themen 3
B fragen zu Aufbau eines UML-Klassendiagramm Java Basics - Anfänger-Themen 1
C 3 Fragen rund um Klassenattribute Java Basics - Anfänger-Themen 8
L Erste Schritte Log4J Fragen Java Basics - Anfänger-Themen 5
NeoLexx Fragen zu diversen Elementen der Javabibliothek Java Basics - Anfänger-Themen 5
D Budget Manager fragen zur Umsetzung Java Basics - Anfänger-Themen 9
N Fragen zur Datenspeicherung Java Basics - Anfänger-Themen 45
T Java Anfänger mit konkreten Fragen Java Basics - Anfänger-Themen 2
CT9288 Fragen zu Java Java Basics - Anfänger-Themen 16
W Fragen zu Generics Java Basics - Anfänger-Themen 14
T ObjectInput/OutputStream Fragen zur Funktionsweise Java Basics - Anfänger-Themen 3
J Fragen zu einer Methode Java Basics - Anfänger-Themen 3
J Fragen zum Code aus dem Buch "Schrödinger programmiert Java 2.te Ausgabe" Java Basics - Anfänger-Themen 6
Z Fragen zu Exception (Throws/throw) Java Basics - Anfänger-Themen 7
J Fragen zu Input/Output Java Basics - Anfänger-Themen 3
J Erste Schritte Oracle Tutorials zu Java 8 - Fragen dazu Java Basics - Anfänger-Themen 1
H Java Quereinsteiger Roadmap und Fragen Java Basics - Anfänger-Themen 29
H fragen Java Basics - Anfänger-Themen 15
M Samelsarium Grundlegender Fragen 2 Java Basics - Anfänger-Themen 9
M Sammelsarium an Grundlagen Grundlagen Fragen Java Basics - Anfänger-Themen 11
B Java ist / wird kostenpflichtig. Ein paar Fragen Java Basics - Anfänger-Themen 1
J Fragen zu synrchonized und kritischen Abschnitten Java Basics - Anfänger-Themen 5
S Fragen zu einem Rechentrainer Java Basics - Anfänger-Themen 2
B Java Vererbung Fragen (zu Code Beispiel) Java Basics - Anfänger-Themen 3
J Wo kann man Fragen zu ireport stellen. Java Basics - Anfänger-Themen 0
M Fragen zum Anlegen und Benutzen von Listen Java Basics - Anfänger-Themen 9
G Ein paar Anfänger Fragen zu StdDraw Java Basics - Anfänger-Themen 4
D Fragen zur Klassen Java Basics - Anfänger-Themen 4
Aprendiendo Zwei Fragen und ein geerbtes "protected"-Attribut Java Basics - Anfänger-Themen 2
J Interface Fragen bezüglich "Sauberkeit" von Code Java Basics - Anfänger-Themen 5
D Objekte-Fragen Java Basics - Anfänger-Themen 1
V Erste Schritte Habe Fragen zu der For und While Schleife als auch Inkrement und Dekrement Java Basics - Anfänger-Themen 4
D Anfänger-Fragen(Parameter einer Methode) Java Basics - Anfänger-Themen 7
K Zwei Fragen zu Graphics/Graphics2D Java Basics - Anfänger-Themen 5
R Fragen über den Konstruktor Java Basics - Anfänger-Themen 0
Azazel Ein paar Fragen zu Methodenaufrufen(java.awt) Java Basics - Anfänger-Themen 2
S Erste Schritte Fragen zur For-Schleife Java Basics - Anfänger-Themen 9
C Interface Fragen zum Interface Java Basics - Anfänger-Themen 7
GreenTeaYT Exception und zur OOP fragen? Java Basics - Anfänger-Themen 3
C Fragen zum Spigot Plugin (1.8) Java Basics - Anfänger-Themen 6
J Fragen zu Exceptions Java Basics - Anfänger-Themen 24
N Quiz- Fragen zufällig anzeigen lassen Java Basics - Anfänger-Themen 7
J Verschieden Fragen über Java Programmierung Java Basics - Anfänger-Themen 3
L Viele Fragen zu den Grundlagen Java Basics - Anfänger-Themen 5
B Fragen zu ZIP-File Java Basics - Anfänger-Themen 9
L fragen zu arrays Java Basics - Anfänger-Themen 8
L Fragen zu selbstgeschriebenem Programm Java Basics - Anfänger-Themen 5
M Fragen zum Auslesen von HTML Seiten Java Basics - Anfänger-Themen 5
J Threading-Aufgabe. Totale Noob Fragen, aber bitte trotzdem beantworten ;) Java Basics - Anfänger-Themen 7
S Java Fragen Konstruktor & Statische Methoden Java Basics - Anfänger-Themen 4
K Erste Schritte Frage Antwort Spiel - Fragen zur Planung Java Basics - Anfänger-Themen 2
C Java Applet Fragen: Serialisierung, Excel import Java Basics - Anfänger-Themen 2
Anfänger2011 2 kleine Fragen zu ArrayListen Java Basics - Anfänger-Themen 5
S Fragen zu Ausdrücken&Bedingungen Java Basics - Anfänger-Themen 5
A 2 kurze Anfänger fragen Java Basics - Anfänger-Themen 6
H grundlegende Fragen Java Basics - Anfänger-Themen 3
V Interface ich schäme mich das zu fragen, aber ich schaff nicht ein Text zu zentrieren :( [javaFX] Java Basics - Anfänger-Themen 6
N Programm: Fragen beantworten Java Basics - Anfänger-Themen 6
C Anfänger Anfänger Fragen Java Basics - Anfänger-Themen 8
Z Compiler-Fehler LinkedList Fragen Java Basics - Anfänger-Themen 4
D Rekursion Allgemeine Fragen Java Basics - Anfänger-Themen 2
D [Fragen] zu Methoden Java Basics - Anfänger-Themen 2
T Ein paar Fragen zu OOP und Java. Java Basics - Anfänger-Themen 16
J Allgemeine Fragen zur GUI Java Basics - Anfänger-Themen 1
johnnydoe Erste Schritte Erster Blick - erste Fragen Java Basics - Anfänger-Themen 11
DStrohma Grundsätzliche Fragen zu Drag & Drop Java Basics - Anfänger-Themen 1
N Klassen fragen zur getter und setter methode Java Basics - Anfänger-Themen 11
S 3 Fragen, Verzeichnis, GridLayout psoitionieren, Werte für JSpinner Java Basics - Anfänger-Themen 2
T Fragen zu Set / Relationen verknüpfen Java Basics - Anfänger-Themen 4
S 2 Fragen Java Basics - Anfänger-Themen 4
S Hallo und Fragen zu Arbeitsverzeichnis und Menü Java Basics - Anfänger-Themen 8
N Java Fragen... Java Basics - Anfänger-Themen 10
F ExecutorService Fragen! Java Basics - Anfänger-Themen 2
O HashMap Fragen Java Basics - Anfänger-Themen 8
C Fragen zu Arrays Java Basics - Anfänger-Themen 19
T viele "kleine" Fragen... Java Basics - Anfänger-Themen 3
S Fragen zu Arrays Java Basics - Anfänger-Themen 6
K Diverse Fragen zum Fehlerlogging Java Basics - Anfänger-Themen 9
N StringReader - Fragen Java Basics - Anfänger-Themen 8
C Einige Fragen zu Frames Java Basics - Anfänger-Themen 7
M Erste Schritte Allgemeine Fragen Java Basics - Anfänger-Themen 4
PaulG Fragen zu Binärbaum Java Basics - Anfänger-Themen 21
P Methoden Aquarium (Fragen zum Scanner) Java Basics - Anfänger-Themen 5
T Erste Schritte Fragen zu meinen kleinen Programm Java Basics - Anfänger-Themen 9
D 2 Fragen: Position ändern vs. LayoutManager / Bilder einfügen im Vordergrund Java Basics - Anfänger-Themen 3
O Zwei Fragen zu Methoden Aufrufen Java Basics - Anfänger-Themen 5
B fragen zur for-schleife und arrays Java Basics - Anfänger-Themen 8
J 2 Fragen zu Befehlen Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben