Baum testen

Status
Nicht offen für weitere Antworten.

granini

Bekanntes Mitglied
Hallo zusammen,

ich habe folgende Frage. Ich habe eine "public class BinTree" geschrieben, die ich gerne testen würde. Ich meine gelesen zu haben, am saubersten wäre es dafür eine neue Klasse zu schreiben?!

Wie mache ich das nun?
Mein Ansatz wäre
Code:
public class BinTest {

	public static void main(String args[]) {
        BinTree test = new BinTree ??(Was für ein Wert übergebe ich hier?)

       Aufruf der Methoden
       }
}

Wer kann mir da weiterhelfen?


Und dann habe ich noch eine Frage. Wie unterscheide ich in Java eine rekursive Klasse von einer rekursiven Methode?

Gruss
 

Illuvatar

Top Contributor
1. Das ist das sauberste, ja, boch sauberer mit Tools wie JUnit, aber das wir für dich wohl nicht nötig sein.
2. Du hast BinTree geschrieben, dann musst du doch wissen, was das für Parameter kriegt :?
3. Was soll eine rekursive Klasse denn sein? 0o
 

granini

Bekanntes Mitglied
Ok, ich habe das Problem ad acta gelegt, und eine class implementiert.

Nun, habe ich aber noch Probleme mit der Ausgabe..

Meine Source
Code:
class Tree {
	int  content;
	Tree left;
	Tree right;
}

public class BinTree {
	public static Tree root;

	public static Tree create (int i) {
		Tree build = new Tree();
		build.content = i;
		build.left = null;
		build.right = null;
		return build;
	}
	public static void NodeInclude (Tree root, int newNode){
		
		if (newNode < root.content)
		{
			if (root.left == null){
				root.left = create(newNode);
			}
			else {
				NodeInclude(root.left,newNode);
			}
			
			if (root.right == null){
				root.right = create(newNode);
			}
			else {
				NodeInclude(root.right,newNode);
			}
		}
	}
	
	public static void NodeOutput(Tree root){
		if (root != null){
			System.out.println("                  "+root.content+"  ");
			System.out.println(root.left+"               "+root.right);
		}
	}
	
public static void main(String args[]) {
		
	root = create(500);
	NodeInclude(root,444);
	NodeInclude(root,521);
	NodeInclude(root,450);
	NodeInclude(root,857);
	NodeInclude(root,666);
	NodeInclude(root,300);
	BinTree.NodeOutput(root);
	System.out.println();
	   
	}  
}

Es erscheint folgende Ausgabe:
Code:
             500  
Tree@119c082               Tree@1add2dd


Wo liegt mein Fehler?
Was kann man am Code ncoh verbessern?

Danke für eure Meinungen..

Gruss
 
B

Beni

Gast
Fehler: du solltest die Methode "toString" überschreiben. Die Methode wird benutzt um Objekte in Strings umzuwandeln, und gibt standardmässig "Klasse@Speicheradresse" zurück...
 

granini

Bekanntes Mitglied
Beni hat gesagt.:
Fehler: du solltest die Methode "toString" überschreiben. Die Methode wird benutzt um Objekte in Strings umzuwandeln, und gibt standardmässig "Klasse@Speicheradresse" zurück...

Danke für die Antwort. Aber irgendwie kann ich nicht soviel damit anfangen.
Wo nutze ich dann diese Methode??

Oder ich verstehe jetzt was falsch...

:?:
 
B

Beni

Gast
Hier benutzt du die:
Code:
System.out.println(root.left+"               "+root.right);
.

Wieso? Weil der Compiler diesen Ausdruck (sinngemäss!) in folgendes umschreibt:
Code:
StringBuilder s = new StringBuilder();
s.append( root.left.toString() );
s.append( "           " );
s.append( root.right.toString() );
System.out.println( s.toString() );
 

granini

Bekanntes Mitglied
Hmm, wieso wird dann eine Zahl bei
Code:
System.out.println("                  "+root.content+"  ");
ausgegeben?


Und wie kann ich die einzelnen Nodes dann anzeigen lassen?

Gruss
 

Leroy42

Top Contributor
root.content ist ein einfacher int für den das Java-System bereits weiß, wie
der auszugeben ist.

Wie du die Nodes anzeigen lassen kannst, hängt davon ab, wie du
sie angezeigt haben willst.

Deine Methode
Code:
   public static void NodeOutput(Tree root){ 
      if (root != null){ 
         System.out.println("                  "+root.content+"  "); 
         System.out.println(root.left+"               "+root.right); 
      } 
   }
legt nahe, daß du den ganzen Baum in einer einzigen Zeile ausgeben willst. Dann
mußt du einfach die Methode toString() in deiner Klasse überschreiben. Wichtig ist,
daß du den Methodenkopf (die Signatur) exakt so schreibst wie ich jetzt, andernfalls
definierst du lediglich eine neue Methode, die nichts mit der toString()-Methode
der Klasse Object zu tun hat und dementsprechend vom Java-System auch nicht
aufgerufen wird.

Code:
public String toString() {
  String res = "(";
  if (left != null) res = res + left;
  res = res + content;
  if (right != null) res = res + right;
  res = res + ")";
  return res;
}
(Eigentlich sollte man statt der Stringaddition einen StringBuffer verwenden,
aber um dich vorerst nicht zu verwirren, laß ich das mal weg).

Den ganzen Baum gibst du dann mit nur einem einzigen Aufruf von
Code:
System.out.println(myTree)
aus.

Falls du den Baum aber doch anders, z.B. zeilenweise, ausgeben willst,
melde dich nochmal.
 

granini

Bekanntes Mitglied
Hmm, und wie bringe ich die korrekt in meine Syntax ein.. Ich habe jetzt die Klasse geschrieben und dafür die Methode NodeOutput gecancelt.
Wo bringe ich den String ein bzw wo rufe ich ihn wieder auf??
 

Leroy42

Top Contributor
Die Methode NodeOutput kannst du doch bestehen lassen.
Sie vereinfacht sich eben zu einem einzigen Aufruf:
Code:
   public static void NodeOutput(Tree root){ 
      System.out.println(root==null ? "Iss schon wieder Winter?" : root);
   }

P.S.: Gewöhne dir langsam an, Methodennamen klein zu schreiben: Codestyle
 

granini

Bekanntes Mitglied
Hmm, irgendwie selbes Ergebnis..

Ich poste nochmal meinen kompletten Code:

Code:
class Tree {
   int  content;
   Tree left;
   Tree right;
}

public class BinTree {
   public static Tree root;

   public static Tree create (int i) {
      Tree build = new Tree();
      build.content = i;
      build.left = null;
      build.right = null;
      return build;
   }
   public static void NodeInclude (Tree root, int newNode){
      
      if (newNode < root.content)
      {
         if (root.left == null){
            root.left = create(newNode);
         }
         else {
            NodeInclude(root.left,newNode);
         }
         
         if (root.right == null){
            root.right = create(newNode);
         }
         else {
            NodeInclude(root.right,newNode);
         }
      }
   }
   
public String toString() {
  String res = "(";
  if (root.left != null) res = res + root.left;
  res = res + root.content;
  if (root.right != null) res = res + root.right;
  res = res + ")";
  return res;
} 

   public static void NodeOutput(Tree root){
      if (root != null){ System.out.println(root);
      }
   }
   
public static void main(String args[]) {
      
   root = create(500);
   NodeInclude(root,444);
   NodeInclude(root,521);
   NodeInclude(root,450);
   NodeInclude(root,857);
   NodeInclude(root,666);
   NodeInclude(root,300);

   NodeOutput(root);
  
      
   } 
}


Ich werde mir angewöhnen Methoden klein zu schreiben.. Versprochen ;-)..
 

Leroy42

Top Contributor
Die toString()-Methode gehört natürlich in die Klasse Tree, denn du willst ja einen
Tree ausgeben und keine Instanz der Steuerungsklasse BinTree.

Allerdings habe ich noch einen Fehler gemacht also ich auf eine Variable
namens root zugegriffen habe, die es in Tree natürlich nicht gibt.

Code:
public String toString() {
  String res = "(";
  if (left != null) res = res + left;
  res = res + content;
  if (right != null) res = res + right;
  res = res + ")";
  return res;
}

Also einfach die Methode so wie sie ist in Tree einfügen und es läuft... :cool:
 

Leroy42

Top Contributor
Ohh, ich sehe gerade, daß ich die Methode ja doch richtig hatte.

Du warst es, der dieses root. eingefügt hast, um die Methode
innerhalb der BinTree-Klasse überhaupt übersetzen zu können, wo es
ja kein left, right und content gibt. :noe:

Pöser Pube! Einfach so an meinen Methoden herumzudoktern :wink:
 

Leroy42

Top Contributor
Ich hab' dein Programm mal laufen lassen und bin über den etwas merkwürdig
konstruierten Baum gestolpert.

Vielleich hast du es schon bemerkt, aber ein deiner Einfügeroutine
ist dir eine geschlossene geschweifte Klammer irgendwie abhanden
gekommen :cool:
 

granini

Bekanntes Mitglied
Hmm,

ok ich habe es verstanden, was du meintest.. Nun werden immerhin die nodes ausgespuckt..

Aber
Code:
(((300)444(300))500((300)444(300)))

?

Oder habe ich noch was nicht beachtet?


Und wenn ich das so sehe, würde mich die Zeilenvariante auch noch interessieren.. Nur wenn es keine Umstände macht natülrich..

Gruss
 

Leroy42

Top Contributor
Illuvatar hat gesagt.:
3. Was soll eine rekursive Klasse denn sein?
Ich schätze er gebraucht diese Bezeichnung, wie Niklaus Wirth damals von
rekursiven Datenstrukturen gesprochen hat.

Also Instanzen der Klasse Tree bestehen ja aus einem Content sowie
einem linken und einem Rechten Tree.

Rekursiv eben.
 

Leroy42

Top Contributor
granini hat gesagt.:
Nur wenn es keine Umstände macht natürlich..
Latürnich doch :D

Da du die Zeilenumbrüche nicht in die toString()-Methode integrieren solltest,
ist es am besten zwei Methoden zu spendieren:

Code:
public String toString() {return ""+content;}
oder besser:
Code:
public String toString() {return String.valueOf(content);}

und als allgemeine Ausgabemethode:
Code:
public void print(PrintWriter p) {
  if (left != null) left.print(p);
  p.println(content);
  if (right != null) right.print(p);
}

Aufrufen tust du diese dann außerhalb:

Code:
root.print(System.out);

Auf diese Weise kannst du dann später einfach einen PrintWriter
übergeben, der deinen Baum in eine Datei speicher ohne irgend
etwas an der Klasse Tree ändern zu müssen.
 

granini

Bekanntes Mitglied
Danke dir.. Werde ich gleich mal versuchen umzusetzen..

Aber wieso ist meine Ausgabe noch fehlerhaft? Wenn du bzw jemand mir dazu noch Hilfestellung geben könnte...?
 

Leroy42

Top Contributor
granini hat gesagt.:
Code:
(((300)444(300))500((300)444(300)))

Wie du siehst, wurde dein Wert 300 gleich 4-mal und die 444 2-mal in
den Baum eingefügt.

Deine verschachtetelten if-Abfragen beim Einfügen sind etwas eigenwillig.

Tipp:

Wenn du etwas links einfügen mußt, fügst du es auch noch gleich
rechts mit ein.

Zum Ausgleich dafür, fügst du, was eigentlich rechts rein müßte,
gleich gar nicht ein. :shock:

Hat zwar was, ist aber auf Dauer irgendwie irritierend. :cool:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D spezifische Knoten in einem Baum zählen Java Basics - Anfänger-Themen 9
HelpInneed Baum ausgeben (aber mal anders) Java Basics - Anfänger-Themen 3
G AVL-Baum Java Basics - Anfänger-Themen 1
G Rot-Schwarz-Baum Java Basics - Anfänger-Themen 8
L Baum aus Integer Liste erstellen Java Basics - Anfänger-Themen 0
CptK Interface Baum visualisieren Java Basics - Anfänger-Themen 37
CptK Best Practice Merge-Sort als Baum darstellen Java Basics - Anfänger-Themen 3
E Baum pfadweise durchlaufen Java Basics - Anfänger-Themen 11
O Naives links rechts einfügen in ADT Baum Java Basics - Anfänger-Themen 8
L Traversierungsverfahren Baum: LevelOrder Java Basics - Anfänger-Themen 17
L Rekursion im Baum Java Basics - Anfänger-Themen 9
L Baum Knoten zählen Java Basics - Anfänger-Themen 6
L B+Baum innere Knoten erstellen Java Basics - Anfänger-Themen 3
D B-Baum einfügen und löschen Java Basics - Anfänger-Themen 2
F Aufgabe Rekursion Binärer Baum Java Basics - Anfänger-Themen 15
D Werte AVL-Baum löschen Java Basics - Anfänger-Themen 2
M Binären Baum Kinder setzen Java Basics - Anfänger-Themen 12
U 2-3-4 Baum Top-Down Java Basics - Anfänger-Themen 4
U 2-3-4 Baum Top-Down Java Basics - Anfänger-Themen 0
J Überprüfen, ob eine 2D Matrix ein Baum ist Java Basics - Anfänger-Themen 5
R Baum erzeugen Java Basics - Anfänger-Themen 61
B Baum Traversierung Postorder Java Basics - Anfänger-Themen 6
B OOP Über einen AVL-Baum iterieren (NullPointer) Java Basics - Anfänger-Themen 5
A Voller Baum Java Basics - Anfänger-Themen 7
S n-ärer Baum Java Basics - Anfänger-Themen 6
O Unterschied Baum <-> Automat Java Basics - Anfänger-Themen 2
K Tiefen- und Breitensuche beim Baum durch Stack und Warteschlange Java Basics - Anfänger-Themen 1
C kompletter baum Java Basics - Anfänger-Themen 2
M Collections Iterator und generischer Baum Java Basics - Anfänger-Themen 0
M Baum Code kurze frage ... Java Basics - Anfänger-Themen 6
D Ein Objekt in einem Baum finden und ausgeben. Java Basics - Anfänger-Themen 4
K Rot-Schwarz-Baum min und max-Tiefe Java Basics - Anfänger-Themen 1
A min() Methode Baum Java Basics - Anfänger-Themen 1
J Baum rekursiv durchlaufen Java Basics - Anfänger-Themen 2
J Baum Knoten löschen Java Basics - Anfänger-Themen 10
T Baum mit Turtle zeichnen Java Basics - Anfänger-Themen 2
Screen 2,4 Baum Frage Java Basics - Anfänger-Themen 6
T Rot-schwarz Baum Problem Java Basics - Anfänger-Themen 3
A Rekursion in Baum und ArrayList als Rückgabe Java Basics - Anfänger-Themen 2
P Pythagoras Baum - Berechnung der Punkte Java Basics - Anfänger-Themen 9
C 2-3 Baum Java Basics - Anfänger-Themen 6
H Baum Java Basics - Anfänger-Themen 4
L Rot Scharz Baum von Binärbaum erben Java Basics - Anfänger-Themen 9
B Baum > Baum-Swing Java Basics - Anfänger-Themen 4
L eigenen Baum schreiben Java Basics - Anfänger-Themen 5
Luk10 Anzahl der Knoten in einem Baum ausgeben! Java Basics - Anfänger-Themen 6
T Array in einen Baum zu überführen Java Basics - Anfänger-Themen 3
S Das reinschreiben einer Klasse in den Baum Java Basics - Anfänger-Themen 6
H B-Baum: Knoten Position als Parameter oder als Variable im Objekt? Java Basics - Anfänger-Themen 4
A Baum mit geometricfigur Werte Java Basics - Anfänger-Themen 6
D Datentypen Einfügen im RotSchwarz Baum Java Basics - Anfänger-Themen 2
F FileSystem in Baum darstellen/wurzel festlegen Java Basics - Anfänger-Themen 3
G List als Rückgabewert einer rekursiven Methode (Baum) Java Basics - Anfänger-Themen 3
I Baum graphisch darstellen Java Basics - Anfänger-Themen 2
P Binärer Baum mit Composite-Entwurfsmuster Java Basics - Anfänger-Themen 2
L Baum Swing AVL Java Basics - Anfänger-Themen 4
Binary.Coder 2-3-4 Baum vs. (2,4) Baum Java Basics - Anfänger-Themen 2
ModellbahnerTT Ab-Baum Applet Java Basics - Anfänger-Themen 3
P Baum-Menü in Java Java Basics - Anfänger-Themen 5
H Baum Java Basics - Anfänger-Themen 11
G AVL Baum Java Basics - Anfänger-Themen 20
J Baum spiegeln Java Basics - Anfänger-Themen 7
N 2-3 Baum, Einfügen Java Basics - Anfänger-Themen 5
G Rekursion mit Return - Baum durchlaufen Java Basics - Anfänger-Themen 4
G Baum Datenstruktur Java Basics - Anfänger-Themen 2
V Baum mit log n Aufwand für Einfügen und Löschen und. Java Basics - Anfänger-Themen 5
H Tiefensuche im binären Baum Java Basics - Anfänger-Themen 2
P Problem mit Darstellung im Baum Java Basics - Anfänger-Themen 4
G Binärer Baum Java Basics - Anfänger-Themen 3
M Binärer Baum Tiefe Java Basics - Anfänger-Themen 14
G universeller baum Java Basics - Anfänger-Themen 13
B Array To Baum Java Basics - Anfänger-Themen 2
B Baum to Array Java Basics - Anfänger-Themen 17
H Löschen in einem binären Baum führt zu einem StackOverflow Java Basics - Anfänger-Themen 2
L Binären Baum speichern Java Basics - Anfänger-Themen 6
R Pythagoras-Baum Java Basics - Anfänger-Themen 5
W Baum durchlaufen Java Basics - Anfänger-Themen 3
T binärer Baum Java Basics - Anfänger-Themen 3
G eine Knoten aus einem Baum löschen. [SOLVED] Java Basics - Anfänger-Themen 7
P allg. Baum aus Liste Java Basics - Anfänger-Themen 2
J String in binären Baum umwandeln Java Basics - Anfänger-Themen 7
R binärer Baum Java Basics - Anfänger-Themen 2
F Abstrakte Klasse Baum Java Basics - Anfänger-Themen 6
L Methoden Eine Methode um zu testen ob es ein Nachbar gibt Java Basics - Anfänger-Themen 10
U JUnit testen auf SomeException Java Basics - Anfänger-Themen 5
U Sortierung in collections testen Java Basics - Anfänger-Themen 11
Düsseldorf2002 Testen meines Algorithmus Java Basics - Anfänger-Themen 1
nonickatall Ausführbarkeit von Code testen bzw. Remote Debugging Java Basics - Anfänger-Themen 4
Y Wie kann ich Konsoleneingaben durch den Scanner mit JUnit 4 testen? Java Basics - Anfänger-Themen 1
B JUnit 4: Wie man die eigene Liste testen kann [TDD] Java Basics - Anfänger-Themen 46
G Java Objekte auf Duplikate testen Java Basics - Anfänger-Themen 4
N Länge eines Arrays in einem Objekt testen Java Basics - Anfänger-Themen 51
T Kann jemand kurz das Programm testen? Java Basics - Anfänger-Themen 13
J RSA Verschlüsselung Testen / byte[] in Objekt umwandeln Java Basics - Anfänger-Themen 1
X Nach einem Bruch testen ob es eine ganze Zahl ist Java Basics - Anfänger-Themen 6
J Womit kann ich diese Methode testen? Java Basics - Anfänger-Themen 5
N JUnit und private Methoden testen. Java Basics - Anfänger-Themen 9
scratchy1 doppelt verkettete Liste testen Java Basics - Anfänger-Themen 8
K Testen in BlueJ Java Basics - Anfänger-Themen 2
J LocalDateTime testen mit Junit Java Basics - Anfänger-Themen 20

Ähnliche Java Themen

Neue Themen


Oben