Datentypen Implementierung eines Binärbaumes

dj3nk

Mitglied
Hallo Hallo erstmal =D. Habe mich nun endlich mal durchgerungen mich in diesem tollen Forum anzumelden. Scheinen ja schon versierte Leute unterwegs zu sein.
Ich habe folgendes Problem, und finde einfach nicht die Ursache......
Ich habe einen normalen Binärbaum implementiert. Die Knoten haben einen schlüssel und einen Inhalt. Beides sind alg. Objekte welche beim einfügen eines Knotens übergeben werden. Der Knackpunkt liegt darin, das als Knotenschlüssel kein primitiver Datentyp wie int verwendet werden soll, sondern Objekte (welche natürlich eine compareTo Methode haben damit man Sie vergleichen kann).

Zum testen habe ich als Schlüsselobjekt die Containerklasse Integer verwendet. Nun findet mein Code allerdings nur den Knoten mit dem gesuchten Inhalt wenn er die Wurzel des Baums ist.
Das Einfügen von Knoten und Ausgeben des Baumes klappt jedoch wunderbar.

Ich füge mal die 3 Klassen an ....

Java:
public class Node {

	private Object key;
	private Object data;
	private Node left, right;

	public Node(Object obj) throws Exception {                        // wenn Inhalt und Schlüssel gleich sind
		this(obj, obj);
	}

	public Node(Object key, Object obj) throws Exception {
		if (obj == null || key == null) {
			throw new Exception("exc");
		} else {
			this.key = key;
			this.data = obj;
		}
	}

	public Node getLeft() {
		return left;
	}

	public void setLeft(Node left) {
		this.left = left;
	}

	public Node getRight() {
		return right;
	}

	public void setRight(Node right) {
		this.right = right;
	}

	public Object getKey() {
		return key;
	}

	public Object getData() {
		return data;
	}

	public int compareTo(Object n) {
		if (((Comparable) (this.getKey())).compareTo((Comparable) ( ((Node)n).getKey())) < 1)
			return -1;
		else if (((Comparable) (this.getKey())).compareTo((Comparable) ( ((Node)n).getKey())) > 1)
			return 1;
		else
			return 0;

	}

	public String toString() {
		return ("[" + key.toString() + ":(" + data.toString() + ")]-");
	}

}


Java:
public class BinTree2 {

	private Node root;
	private Node comp; // wird beim suchen für insert() hinterlegt. Ist letzter besuchter Knoten.
	private String temp;

	public BinTree2() {
		this.root = null;
	}

	public boolean insert(Node newNode) throws Exception {
		if (newNode == null)
			return false;
		else {

			if (root == null) // root leer
				root = newNode;
			else { // root schon vorhanden

				if (searchKey(newNode.getKey()) == true) { // schon vorhanden;
					// rechts anhaengen
					newNode.setRight(comp.getRight());
					comp.setRight(newNode);
				} else { // noch nicht vorhanden; check groesser kleiner

					if (newNode.compareTo(comp) < 0) // links einsetzen
						comp.setLeft(newNode);
					else
						comp.setRight(newNode);

				}

			}
			return true;
		}
	}


	public boolean searchKey(Object k) throws Exception { // durchsucht KEYS
		return searchKey(k, root);
	}

	private boolean searchKey(Object k, Node tempRoot) throws Exception { // durchsucht
		// KEYS
		comp = tempRoot; // wird gebraucht in insert !!!!!!!

		if (comp.getKey() == k) // gefunden
			return true;

		else { // nicht gefunden

			if (((Comparable) k).compareTo(((Comparable) (comp.getKey()))) < 0) { // k
																				// <
																				// tempRoot.key
				if (comp.getLeft() != null)
					searchKey(k, comp.getLeft());
			} else { // k > tempRoot
				if (comp.getRight() != null)
					searchKey(k, comp.getRight());
			}

		}
		return false;

	}

	public String toString() {
		temp = "";
		return (toString(root));
	}

	public String toString(Node tempRoot) {

		if (tempRoot.getLeft() != null)
			toString(tempRoot.getLeft());

		temp += "\n" + tempRoot.toString();

		if (tempRoot.getRight() != null)
			toString(tempRoot.getRight());

		return temp;
	}

}


Java:
public class BinTreeTest {

	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		BinTree2 bt = new BinTree2();
		Node n;

		Integer iii = new Integer(4111);
		Artikel d = new Artikel(iii, "bier", 554);
		n = new Node(iii, d);
		bt.insert(n);

		Integer jjj = new Integer(4211);
		Artikel e = new Artikel(jjj, "holz", 900);
		n = new Node(jjj, e);
		bt.insert(n);

		System.out.println("--> toString(): " + bt.toString());
		System.out.println("--> Suche Art. 4211: " + bt.searchKey(jjj) );

	}

}

Ich hoffe das mir jemand die Antwort für mein Problem geben kann und bedanke mich bereits im Vorraus.


Grüsse =D
 

dj3nk

Mitglied
sorry fehlte noch die Ausgabe:

Artikel; neuer Artikel angelegt: 4111 ; bier ; 554
Artikel; neuer Artikel angelegt: 4211 ; holz ; 900
--> toString():
[4111:(4111 ; bier ; 554)]-
[4211:(4211 ; holz ; 900)]-
--> Suche Art. 4211: false



und die Klasse Artikel
Java:
public class Artikel {

	private int artikelNr;
	private String bezeichnung;
	private int bestand;

	// /////////////////////////////////////////////////
	// Konstruktoren
	// /////////////////////////////////////////////////

	public Artikel(int artikelNr) {
		this.artikelNr = artikelNr;
		this.bezeichnung = "keine Bezeichnung";
		this.bestand = 0;
		System.out.println("Artikel; neuer Artikel angelegt: " + this.toString());
	}

	public Artikel(int artikelNr, int bestand) {
		this.artikelNr = artikelNr;
		this.bezeichnung = "keine Bezeichnung";
		this.bestand = bestand;
		System.out.println("Artikel; neuer Artikel angelegt: " + this.toString());
	}

	public Artikel(int artikelNr, String bezeichnung) {
		this.artikelNr = artikelNr;
		this.bezeichnung = bezeichnung;
		this.bestand = 0;
		System.out.println("Artikel; neuer Artikel angelegt: " + this.toString());
	}

	public Artikel(int artikelNr, String bezeichnung, int bestand) {
		this.artikelNr = artikelNr;
		this.bezeichnung = bezeichnung;
		this.bestand = bestand;
		System.out.println("Artikel; neuer Artikel angelegt: " + this.toString());
	}

	// /////////////////////////////////////////////////
	// Methoden
	// /////////////////////////////////////////////////

	public void bucheZugang(int menge) throws Exception {
		if (menge > 0)
			setBestand(this.bestand + menge);
		else
			throw new Exception("Buche Zugang Fehler");
	}

	public void bucheAbgang(int menge) throws Exception {
		if (menge > 0)
			setBestand(this.bestand - menge);
		else
			throw new Exception("Buche Zugang Fehler");
	}

	// /////////////////////////////////////////////////
	// getter
	// /////////////////////////////////////////////////

	public int getArtikelNr() {
		return this.artikelNr;
	}

	public String getBezeichnung() {
		return this.bezeichnung;
	}

	public int getBestand() {
		return this.bestand;
	}

	// /////////////////////////////////////////////////
	// setter
	// /////////////////////////////////////////////////

	public void setBezeichnung(String bezeichnung) throws Exception {
		if (bezeichnung != null && bezeichnung != "")
			this.bezeichnung = bezeichnung;
		else
			throw new Exception("setBezeichnung Fehler");
	}

	public void setBestand(int bestand) throws Exception {
		if (bestand > -1)
			this.bestand = bestand;
		else
			throw new Exception("setBestand Fehler");
	}

	// /////////////////////////////////////////////////
	// toString()
	// /////////////////////////////////////////////////

	public String toString() {

		return artikelNr + " ; " + bezeichnung + " ; " + bestand;
	}

	// /////////////////////////////////////////////////
	// main()
	// /////////////////////////////////////////////////

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}
 

eRaaaa

Top Contributor
Ein Problem wird wohl sein:
Java:
    if (comp.getKey() == k) // gefunden

Integer sind Objekte...also müßtest du auch equals benutzen...allerdings wird das so trotzdem nicht gehen, da das ja nur die Rückgabe des rekursiven Aufrufs ist ...
 

Michael...

Top Contributor
Hab den Code nur mal schnell überflogen. Zumindest mal ein paar Hinweise kann ich Dir geben:
- Ich würde mir eine eigene Klasse Key schreiben, die Comparable implementiert.
- Objekte vergleicht man mit euqals, also statt
Java:
if (comp.getKey() == k)
Java:
if (comp.getKey().equals(k))
- die compare Methode in Node kann man auf jedenfall vereinfachen
Java:
public int compareTo(Object n) {
    return ((Comparable) (this.getKey())).compareTo((Comparable) (((Node)n).getKey()));
}
Ist zwar immer noch nicht schön...
 

dj3nk

Mitglied
Wuh, das ging ja schnell......

schonmal danke hierfür

Ich habe das jetzt mal mit equals ersetzt was aber leider immer noch nichts geändert hat :(

Was genau meinst du mit einer eigenen Klasse für key ? Was sollte darin enthalten sein ausser das Objekt und die compareTo Methode?
 
Zuletzt bearbeitet:

eRaaaa

Top Contributor
Den zweiten Teilsatz von mir hast du gelesen?

basierend auf deinem Code:
Java:
    private boolean searchKey(Object k, Node tempRoot) throws Exception { // durchsucht
	// KEYS
	comp = tempRoot; // wird gebraucht in insert !!!!!!!
	boolean found = false;   //////NEU !!!!!!
	if (comp.getKey().equals(k)) {
	    return true;
	} else { // nicht gefunden
	    if (((Comparable) k).compareTo(((Comparable) (comp.getKey()))) < 0) { // k
		// <
		// tempRoot.key
		if (comp.getLeft() != null)
		    found = searchKey(k, comp.getLeft());  //////NEU/found !!!!!!
	    } else { // k > tempRoot
		if (comp.getRight() != null)
		    found = searchKey(k, comp.getRight());//////NEU/found !!!!!!
	    }
	    if (found)   //////NEU !!!!!!
		return true;
	}
	return false;
    }

so könnte das funktionieren ;)
 
Zuletzt bearbeitet:

dj3nk

Mitglied
Uh jaaaa, es scheint zu klappen :D

VIELEN DANK !!!

Ich habs zwar noch nich ganz genau betrachtet weil ich grade schnell noch was einkaufen gehn muss, aber sobald ich zurück bin schau ich mir das mal ganz genau an was du geändert hast.

Supi :D

edit:
Ach klar, habs verstanden. Habe schon ewig nach dem Denkfehler gesucht. =)

Danköö
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Implementierung eines Zustandsdiagramms Java Basics - Anfänger-Themen 19
H Implementierung eines Interfaces erweitern Java Basics - Anfänger-Themen 13
B OOP Implementierung eines Heaps Java Basics - Anfänger-Themen 13
S Fragen zur Implementierung eines Binärbaums Java Basics - Anfänger-Themen 3
S Fragen zur Implementierung eines Adressbuches Java Basics - Anfänger-Themen 20
G Implementierung eines Kontos Java Basics - Anfänger-Themen 11
E Performante Implementierung eines "Hintergrundprogramms" Java Basics - Anfänger-Themen 10
ruutaiokwu JRE-/JDK-unabhängige PBKDF2WithHmacSHA512-Implementierung Java Basics - Anfänger-Themen 16
V Hilfe bei Implementierung einer boolean Methode Java Basics - Anfänger-Themen 6
K Fehler bei der Implementierung Java Basics - Anfänger-Themen 6
J Implementierung gcd();square() Java Basics - Anfänger-Themen 98
J Implementierung von Observer und Singleton-Pattern Java Basics - Anfänger-Themen 9
A Implementierung von String toString methode() Java Basics - Anfänger-Themen 4
G Projekt architektur (implementierung) Java Basics - Anfänger-Themen 3
M Implementierung einer getNextId Methode Java Basics - Anfänger-Themen 5
J Implementierung Listen-ADT Java Basics - Anfänger-Themen 131
I GenericQueue / Implementierung als Ringspeicher Java Basics - Anfänger-Themen 4
MiMa Log4j2 implementierung Java Basics - Anfänger-Themen 4
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
G Array implementierung Java Basics - Anfänger-Themen 23
J ANTLR Installierung und Implementierung Java Basics - Anfänger-Themen 2
E Hilfe bei Implementierung von Methoden Java Basics - Anfänger-Themen 10
S SkipList Implementierung Java Basics - Anfänger-Themen 1
J Methoden Suche effiziente Implementierung für eine Methode Java Basics - Anfänger-Themen 3
J Interface Probleme bei der Implementierung Java Basics - Anfänger-Themen 1
E hashCode implementierung Java Basics - Anfänger-Themen 9
S Implementierung der Klasse Konto und Nutzung bereits vorhandener Klassen Java Basics - Anfänger-Themen 7
O Generics - Implementierung Java Basics - Anfänger-Themen 7
A Hilfestellung zur Implementierung des Gaußsches Eliminationsverfahren Java Basics - Anfänger-Themen 4
K Bucketsort Implementierung Java Basics - Anfänger-Themen 0
K Mergesort Fehler in der Implementierung Java Basics - Anfänger-Themen 2
K Quicksort Fehler in der Implementierung Java Basics - Anfänger-Themen 2
S Klassen Klassendiagramm Implementierung? Java Basics - Anfänger-Themen 5
J Bucketsort Implementierung Java Basics - Anfänger-Themen 0
C Stack - listenbasierte Implementierung Java Basics - Anfänger-Themen 4
N Was bedeutet "Implementierung vor dem Client verbergen" bei Design Patterns? Java Basics - Anfänger-Themen 2
T Collections LinkedList<LinkedList<T>> - Implementierung Java Basics - Anfänger-Themen 10
F Implementierung von Interfaces -> Problem mit main Java Basics - Anfänger-Themen 12
D Resourcebundle implementierung Java Basics - Anfänger-Themen 2
M Implementierung des Knuth-Morris-Pratt-Algorithmus Java Basics - Anfänger-Themen 0
Q Implementierung von Listenern Java Basics - Anfänger-Themen 4
B Klassen Hilfe bei Implementierung Java Basics - Anfänger-Themen 5
N Compiler-Fehler Comparable / compareTo implementierung Java Basics - Anfänger-Themen 2
I Erste Schritte Implementierung der API Java Basics - Anfänger-Themen 2
M falsche implementierung von currentTimeMillis() ? Java Basics - Anfänger-Themen 14
M Quicksort implementierung Java Basics - Anfänger-Themen 23
SexyPenny90 Implementierung einer doubly linked list Java Basics - Anfänger-Themen 5
N Binärbaum/Implementierung Java Basics - Anfänger-Themen 9
U Doppelte Interfcae Implementierung Java Basics - Anfänger-Themen 10
K Kleiner Fehler bei Methoden Implementierung Java Basics - Anfänger-Themen 6
M Collections Problem bei Überschreibung von hashcode() und equals() bei Hashset-Implementierung Java Basics - Anfänger-Themen 5
S OOP Implementierung Komposition, Aggregation, Assoziation und Generalisierung Java Basics - Anfänger-Themen 2
C Klassenhirarchien zur Implementierung von Fahrzegen Java Basics - Anfänger-Themen 26
BinaryLogic Datentypen Statistik Interface - untersch. Implementierung Java Basics - Anfänger-Themen 5
S Saubere Implementierung Java Basics - Anfänger-Themen 2
K Dijkstra implementierung 2.0 Java Basics - Anfänger-Themen 19
K dijskral implementierung Java Basics - Anfänger-Themen 14
U Probleme mit Server-Client implementierung Java Basics - Anfänger-Themen 5
K Game of Life Implementierung Java Basics - Anfänger-Themen 30
B OOP Problem bei Implementierung von Interface Java Basics - Anfänger-Themen 6
J HashSet Implementierung Java Basics - Anfänger-Themen 16
R NullPointerException in Queue-Implementierung Java Basics - Anfänger-Themen 11
X Frage zur Implementierung von equals() Java Basics - Anfänger-Themen 2
B Effektive Implementierung für Darstellung großer Datenmengen in Jogl Java Basics - Anfänger-Themen 5
B Implementierung Java Basics - Anfänger-Themen 2
N Implementierung Tic tac toc Java Basics - Anfänger-Themen 25
O Stack Implementierung als verkettete Liste Java Basics - Anfänger-Themen 8
Y Implementierung einer Potenzturm Funktion Java Basics - Anfänger-Themen 4
S Implementierung gegen Interfaces / List, ArrayList, LinkedList Java Basics - Anfänger-Themen 11
J Quicksort Implementierung-- Exception ArrayOutOfBounds Java Basics - Anfänger-Themen 6
U Implementierung Constructor Java Basics - Anfänger-Themen 7
T Problem mit Implementierung von einer HashMap aufgabe Java Basics - Anfänger-Themen 2
G Implementierung des Observer/Observable Patterns - Gut so? Java Basics - Anfänger-Themen 3
I Zugriff auf Implementierung verhindern Java Basics - Anfänger-Themen 8
D Implementierung nach MVC Java Basics - Anfänger-Themen 6
B Theoretische Frage zum Programmbau (nun zur Implementierung) Java Basics - Anfänger-Themen 8
H Implementierung von Interfaces Java Basics - Anfänger-Themen 4
G Implementierung von Bäumen Java Basics - Anfänger-Themen 2
N Probleme mit paint() bei Implementierung in ein Panel Java Basics - Anfänger-Themen 4
B Wie funktioniert die implementierung von c code in Java? Java Basics - Anfänger-Themen 7
M Länge eines Arrays als Variable speichern möglich? Java Basics - Anfänger-Themen 14
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
P Wie kann ich beispielsweise Speicherstände eines Spiels DAUERHAFT in meinem Programm speichern? Java Basics - Anfänger-Themen 3
laxla123 Eigenschaften eines Algorithmus (determiniert vs.. deterministisch) Java Basics - Anfänger-Themen 2
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Fehler Semikolon fehlt - ich weiss aber nicht wo da noch eines hin sollte... Java Basics - Anfänger-Themen 21
J Farbe des Striches eines TitledBorders ändern Java Basics - Anfänger-Themen 2
pc pc pc pc pc letztes Element eines Arrays n Java Basics - Anfänger-Themen 3
walid Öffnungszeiten eines Geschäftes Java Basics - Anfänger-Themen 3
paulen1 Best Practice "Unchecked Assignment" Warnung beim erstellen eines 2D Arrays of Arraylists Java Basics - Anfänger-Themen 2
T Probleme beim Import eines Git-Repos Java Basics - Anfänger-Themen 2
U Eigenschaft eines JTextfiels per ActionListener ändern... Java Basics - Anfänger-Themen 2
B Synchronisation eines kleinen Museums Java Basics - Anfänger-Themen 47
krgewb Breite und Höhe eines Bildes in base64 auslesen Java Basics - Anfänger-Themen 3
Sachinbhatt Was ist die Notwendigkeit eines Sammlungsframeworks in Java? Java Basics - Anfänger-Themen 2
N Textdatei aus Resourcen-Ordner eines Projekts/ jar-file lesen Java Basics - Anfänger-Themen 4
B Produkt eines double - streams Java Basics - Anfänger-Themen 3
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
S Variablen Letzte Zeile eines Strings entfernen Java Basics - Anfänger-Themen 1
D Inhalt eines Arrays ausgeben Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben