BinTree

public_class

Mitglied
HEy Leute, mein Eclipse ist leider ausgefallen deshalb weiß ich nicht ob mein Bintree so funktioniert, kann einer den vielleicht durchlaufen lassen und das resultat anschauen??? DANKE, ps der Baum sollte 3 level haben!!! Wenn euch fehler auffallen, hilfestellung nehm ich immer gerne...
Java:
public class BinTreee
{
	private Object inhalt;
	private BinTreee links, rechts;
	
	public BinTreee()
	{
		inhalt = null;
		links = null;
		rechts = null;
	//nachher Ein leerr Baum existiert
	}
	
	public BinTreee (Object pObject)
	{
		inhalt = pObject;
		links = new BinTreee();
		rechts = new BinTreee();
	
	/*nachher Der Binärbaum existiert und hat einen Wurzelknoten mit dem Inhalt pObject
	und zwei leeren Teilbäumen.*/
	}
	
	public BinTreee (Object pObject, BinTreee pLeftTree, BinTreee
	pRightTree)
	{
		inhalt = pObject;
		links = pLeftTree;
		rechts = pRightTree;
		
	/*nachher Der Binärbaum existiert, hat einen Wurzelknoten mit dem Inhalt pObject sowie
	dem linken Teilbaum pLeftTree und dem rechten Teilbaum pRightTree.*/
	}
	
	public boolean isEmpty()
	{
		if(inhalt==null&&links==null&&rechts==null)
		{
			return true;
		}
		else
		{
			return false;
		}

	/*nachher Diese Anfrage liefert den Wahrheitswert true, wenn der Binärbaum leer ist,
	sonst liefert sie den Wert false.*/
	}
	
	public void clear()
	{
		inhalt = null;
		links = null;
		rechts = null;
		
	/*nachher Der Binärbaum ist leer.*/
	}
	
	public void setRootItem (Object pObject)
	{
		inhalt = pObject;

	/*nachher Die Wurzel hat – unabhängig davon, ob der Binärbaum leer ist oder schon
	eine Wurzel hat – pObject als Inhalt. Eventuell vorhandene Teilbäume werden
	nicht geändert.*/
	}
	
	public Object getRootItem()
	{
		if(!this.isEmpty())
		{
			return inhalt;
		}
		else
		{
			return null;
		}
		
	/*vorher Der Binärbaum ist nicht leer.
	nachher Diese Anfrage liefert den Inhalt des Wurzelknotens des Binärbaums.*/
	}
	
	public void setLeftTree (BinTreee pTree)
	{
		if(!this.isEmpty())
		{
			links = pTree;
		}

	/*vorher Der Binärbaum ist nicht leer.
	nachher Die Wurzel hat den übergebenen Baum als linken Teilbaum.*/
	}
	
	public void setRightTree (BinTreee pTree)
	{
		if(!this.isEmpty())
		{
			rechts = pTree;
		}
		
	/*vorher Der Binärbaum ist nicht leer.
	nachher Die Wurzel hat den übergebenen Baum als rechten Teilbaum.*/
	}
	
	public BinTreee getLeftTree()
	{
		if(!this.isEmpty())
		{
			return links;
		}
		else
		{
			return null;
		}
		
	/*vorher Der Binärbaum ist nicht leer.
	nachher Diese Anfrage liefert den linken Teilbaum der Wurzel des Binärbaums. Der
	Binärbaum ist unverändert.*/
	}
	
	public BinTreee getRightTree()
	{
		if(!this.isEmpty())
		{
			return rechts;
		}
		else
		{
			return null;
		}
		
	/*vorher Der Binärbaum ist nicht leer.
	nachher Diese Anfrage liefert den rechten Teilbaum der Wurzel des Binärbaums. Der
	Binärbaum ist unverändert.*/
	}

	public static void main(String[] args) 
	{
		BinTreee bintree = new BinTreee();
		bintree.setRootItem("Baum");
		BinTreee xtree = new BinTreee("Baum1", new BinTreee("Baum2"), new BinTreee("Baum3"));
		xtree.setLeftTree(xtree);
		BinTreee ytree = new BinTreee("Busch1", new BinTreee("Busch2"), new BinTreee("Busch3"));
		ytree.setLeftTree(ytree);
		BinTreee ztree = new BinTreee("Hecke1", new BinTreee("Hecke2"), new BinTreee("Hecke3"));
		ztree.setRightTree(ztree);
	}
 
T

Tomate_Salat

Gast
Code:
Exception in thread "main" java.lang.NoClassDefFoundError: BinTree
Caused by: java.lang.ClassNotFoundException: BinTree
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:303)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
Could not find the main class: BinTree.  Program will exit.

Wenn du es testen willst, dann kompiliere doch selbst mittels [c]javac binTreee.java[/c] und führe das ganze mit [c]java binTreee[/c] aus
 

eRaaaa

Top Contributor
Code:
Exception in thread "main" java.lang.NoClassDefFoundError: BinTree
Caused by: java.lang.ClassNotFoundException: BinTree
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:303)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
Could not find the main class: BinTree.  Program will exit.

Wenn du es testen willst, dann kompiliere doch selbst mittels [c]javac binTreee.java[/c] und führe das ganze mit [c]java binTreee[/c] aus

Ne ne, da hast du dich wohl verschrieben ;D Bei ihm heißt es BinTreee, mit 3 E :D

Allerdings hast du ja nirgends eine Ausgabe drin, also was sollen wir dir da jetzt schon groß sagen? :D
 
T

Tomate_Salat

Gast
Hoppla. *kopf auf tisch hau* Bei dem Klassennamen hab ich mich jz also schon mind. 3x verschrieben. Das mit den Consolen-einträgen war jz einfach auf die schnelle^^ aber Treee mit Tripple e...naja, da gewöhnt man sich nit so leicht dran. BinTTripleE wäre en schönere Klassenname :D
 

Ziegenpeter

Aktives Mitglied
Ok, also da ist einiges falsch und manchens unschön (aber nicht falsch).
Ich fang mal an:

1.
Java:
public static void main(String[] args) 
    {
        BinTreee bintree = new BinTreee();
        bintree.setRootItem("Baum");
        BinTreee xtree = new BinTreee("Baum1", new BinTreee("Baum2"), new BinTreee("Baum3"));
        xtree.setLeftTree(xtree);
        BinTreee ytree = new BinTreee("Busch1", new BinTreee("Busch2"), new BinTreee("Busch3"));
        ytree.setLeftTree(ytree);
        BinTreee ztree = new BinTreee("Hecke1", new BinTreee("Hecke2"), new BinTreee("Hecke3"));
        ztree.setRightTree(ztree);
    }

Dein Baum wird niemals Tiefe 3 bekommen, da der linke Teilbaum von xtree, ytree und ztree jeweils wieder sie selbst sind. Diese 3 bzw. 4 Knoten sind nicht verbunden! Nach der Erstellung deiner Bäume musst du wie folgt vorgehen:
Java:
ytree.setLeftTree(ztree)
Dann fügst du diesen Baum an den xtree an und dann fügst du den neuen Tree an bintree an.

2. Deine Konstruktoren sind untereinander inkonsistent. Beim ersten Konstruktor ist alles null, was eine annehmbare Maßnahme ist. Bei deinem zweiten Konstruktor (public BinTreee(Object pObject)) erstellst du allerdings zwei Unterbäume, die wiederum den ersten Konstruktor aufrufen. Das ist äußerst unschön. Dein dritter Konstruktor ist dagegen in Ordnung, da du dort ja schon fertige Bäume anhängst.

3.
Java:
public void clear()
    {
        inhalt = null;
        links = null;
        rechts = null;
        
    /*nachher Der Binärbaum ist leer.*/
    }
Diese Methode kannst du dir sparen. Wenn du das möchtest, kannst du einfach gleich die Variable der Instanziierung auf null setzen. Was vielleicht sinnvoller ist, ist das löschen des Inhalts. Ich weiß aber nicht was du wirklich damit bezwecken wolltest.

Jetzt zu den eher unschönen Dingen, die aber keine Fehler sind:

4.
Java:
public boolean isEmpty()
    {
        if(inhalt==null&&links==null&&rechts==null)
        {
            return true;
        }
        else
        {
            return false;
        }
 
    /*nachher Diese Anfrage liefert den Wahrheitswert true, wenn der Binärbaum leer ist,
    sonst liefert sie den Wert false.*/
    }
Das kannst du leichter haben, nämlich mit
Java:
public boolean isEmpty(){
   return inhalt==null&&links==null&&rechts==null;
}

Würdest du deine Konstruktoren konsistent halten könntest du dir auch das if bei getRightTree() sowie getLeftTree() sparen können.

Soo und nun zu deiner Frage im letzten Post. Du überschreibst die toString()-Methode in dem du rekursiv in dem Baum absteigst. Dann bastelst du die erhaltenen Strings so zusammen wie du das gern hättest. Da es dafür keine Pauschallösung gibt, je nachdem was man braucht, erspar ich es mir mal eine meiner Vorstellungen hinzuschreiben.

Gruß
Ziegenpeter
 

eRaaaa

Top Contributor
okay, aber wie mach ich denn hier die ausgabe für den baum???
Naja, kommt drauf an wie du diesen durchlaufen magst oder? Preorder, postorder, inorder usw. ?!
Wahrscheinlich würde man sich da einen Iterator dafür schreiben, keine Ahnung, das führt hier aber denke ich zu weit, eine einfache Methode reicht hier wahrscheinlich!
ich kann irgendwie immer nur die wurzel ausgeben aber nicht die verzweigungen....

meiner Meinung nach ist deine Main auch etwas falsch, die Wurzel bekommt ja irgendwie gar keine Kinder zugewiesen?!

Beispiel:
Java:
    public static void main(String[] args) {
	BinTreee bintree = new BinTreee("Baum"); //wobei das ja glaub ich schon falsch wäre?!
	BinTreee links = new BinTreee("Links");
	BinTreee rechts = new BinTreee("Rechts");
	bintree.setLeftTree(links);
	bintree.setRightTree(rechts);
	links.setLeftTree(new BinTreee("LinksA"));
	rechts.setLeftTree(new BinTreee("RechtsLinks"));
	rechts.setRightTree(new BinTreee("RechtsRechts"));
	bintree.printPreOrder(); //als Ausgabe z.B.
    }
Dann würde der Baum so aussehen:
Code:
                   Baum
        Links                 Rechts
LinksA           RechtsLinks   RechtsRechts

printPreOrder() z.b. dann irgendwie so (und ich würde eien toString einführen)
Java:
    public void printPreOrder() {
	System.out.println(this);
	if (this.getLeftTree() != null) {
	    this.getLeftTree().printPreOrder();
	}
	if (this.getRightTree() != null) {
	    this.getRightTree().printPreOrder();
	}
    }

    @Override
    public String toString() {
	return this.inhalt.toString();
    }

und dein einer Konsturktor public BinTreee(Object pObject) { würde ich nur inhalt setzen! links und rechts bleiben null !
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben