7.3


haaallo, ich bins mal wieder. gut alles funzt bei mir allerdings sagt er auch:

Type safety: The return type BinaerbaumInterface for left() from the type Binaerbaum needs unchecked conversion to conform to BinaerbaumInterface from the type BinaerbaumInterface Binaerbaum

was heißt das? er macht sonst alles richtig


Abend,

public BinaerbaumInterface left()

kann es sein, dass du das vergessen hast? Ansonsten hab ich keine Ahnung Oo

  • tobi

äh ja, stimmt duck eiegntlich hab ichs doch aus dem interface per eclipse rüber geholt… komisch… naja danke jedenfalls


sagt mal, oder die frage richtet sich wohl eher an verantwortliche, bei der aufgabe traverse(int tiefe) habe ich auch eine zweite methode verwiesen, die rekursiv is (also die wzeite methode) und einen weiteren parameter hat, also


traverse(int tiefe){
	traverse2(tiefe, zweiteZahl)
}

traverse2(int tiefe, int zweiteZahl){
//rekursiver aufruf von traverse2(..., ...)
System.out.println(...);
}

erfüllt das die aufgabenstellung?


für was? woher soll die zweite zahl beim testen denn kommen und für was is die gedacht? reicht doch wenn traverse rekursiv is…


.

Stehe auf dem Schlauch :wink:
Servus ihr Spezialisten,
mein erster Post lässt sich leider doch nicht vermeiden :frowning:
Egal, ich hab ein Problem:

Irgendwie stehe ich total auf dem Schlauch, wie dieser Binärbaum überhaupt verstanden/implementiert werden soll…

Also ich schnall im Moment grade nicht, wie intern so ein Binärbaum aussehen soll. Ich hab mir mal 2 Gedanken gemacht:

  • Entweder hat der Binärbaum einen Verweis auf seinen linken Ast, der ein eigner Binärbaum ist, dann seinen Wert als Variable, und dann den Verweis auf rechten Ast (was ja auch ein Binärbaum ist)
  • Oder ich schreibe ne Heap, und schreibe da immer alle Werte des linken und rechten Asten rein, plus den Wert den ich grade einfüge per Konstruktor. Das ist aber ne Heiden arbeiten in meinen Augen, und da gibts nur 10 Punkte (und da müsste er “balanciert” sein, das ist hier eh net gefordert, gell?).

Also, ich schnall dat nicht… Könnte ihr mir bitte nen Denkanstoß geben (und ja, ich hab die Folien gelesen :wink: )
Ich weiß auch, was die einzelnen Funktionen machen sollen (zumindest tlw) :stuck_out_tongue:

Danke euch!


ein binaerbaum hat nen knoten mit wert, nen linken ast und ein rechter ast, wobei die Äste eigentlich nichts anderes darstellen als referenzen auf knoten anderer bäume


OK, aber was nun, wenn ich die alten Binärbäume änder?!
Dann ändert sich der andre, der aus den alten aufgebaut ist ja mit - ist das Absicht?
Oder sollten die “Ursprungsbäume” intern kopiert werden, und dann diese unverändert bleiben?
Irgendwie mag ich die Aufgabe net^^

Danke dem Der Ich schonmal :stuck_out_tongue:

€: OK, und nen andres Thema: somehow mag mich das Programm nicht. Muss auf Gegenseitigkeit beruhen.
→ Sagen wir, ich lasse im Konstruktor den übergebenen linken Teil in eine Variable “public Binaerbaum links;” per Anweisung “links = left;” schreiben. Das geht.
Nur wie bekomme ich dass jetzt in ein BinaerbaumInterface gecastet, ums in der left()-Methode auszugeben?
Mit “return (BinaerbaumInterface) links;” gehts genausoweinig wie mit “return (BinaerbaumInterface) links;”
Jeweils Fehler… hmm… hatte ich erwähnt, das ich das Programm nicht mag?!


sicherlich hast du hoff ich doch am Anfang deines Programms die Variable so deklariert:

BinaerbaumInterface links;

Was meinst du mit alte Binaerbäumen ändern? Das ist nicht vorgesehen, du sollst nur ein Programm schreiben mit dem man welche erzeugen kann und mit traverse(int tiefe) alle Knoten abklappert, wobei mit jedem Aufruf von traverse die Tiefe und der Wert des jeweiligen Knotens ausgegeben werden soll.

UND UM HIMMELSWILLEN, wenn es heißt FEHLER, dann bitte MIT FEHLERMELDUNG die der COMPILER ausspuckt.


Amen =) …

@ PoWerBaR, kleiner Tip (drei kurze Auszüge aus meinem Code, die dir vielleicht den richtigen Denkanstoß geben können):

private BinaerbaumInterface<Type> linkerAst;      // private Variablen machen's sehr einfach ;)
private BinaerbaumInterface<Type> rechterAst;
private Type Wert;
	
public Binaerbaum(){			//Konstruktor fuer leeren Binaerbaum
	this.linkerAst = null;
	this.rechterAst = null;
	this.Wert = null;
}

public BinaerbaumInterface<Type> left(){	// Gibt den linken Unterbaum zurueck
	return this.linkerAst;
}

Joa ich selbst habe jetzt aber doch noch eine Frage zu dem Problemchen, was Noya anfangs irgendwann angesprochen hat:
traverse(2) heisst doch nichts anderes, als dass quasi der Baum ganz normal aufgelistet wird, nur eben, dass die jeweiligen Tiefen der Elemente einfach alle um 2 erhöht sind. Damit hat die Baum-Wurzel einfach Tiefe 2 (anstatt normalerweise 0)… oder? Also so habe ich das nach wie vor verstanden. o_O
Oder sollen damit nur noch alle Elemente ab einschließlich der 3. Ebene ausgespuckt werden?
→ Da müsste ich meinen Code dann doch noch mal ändern, allerdings war das meiner Meinung nach nicht in der Aufgabenstellung definiert und ist somit evtl belanglos (weil die Testcases nur mit traverse(0) prüfen? :wink: ??)… =)
Danke für genaue Auskunft schon mal vorweg @Master M.W. :slight_smile:


wenn du die wurzel mit tiefe 2 aufrufst is klar das einfach nur alles um 2 erhöht is…

dann müsstest traverse auf einen knoten anwenden der in der tiefe liegt, wwenn du nur die haben willst, und dass dann auch nur zu denen kommst die drunter liegen ist auch klar. aber mehr als traverse(0) an der wurzel is nich verlangt.


danke dny - jap, das geht wunderbar, solangen ich nicht den andren konstruktor verwende… bzw solangen in linkerAst nicht probiere im Konstruktor den übergebenen Linken Baum zu schreiben. Weil so sieht das bei mir aus:

private BinaerbaumInterface<Type> links;

public Binaerbaum(final Binaerbaum left, final Type value, final Binaerbaum right) { //Der Konstruktor...
		this.links = (BinaerbaumInterface<Type>) left;
}

Und der passende Fehler:

C:\_Daten\Uni\Vorlesungen\Algo1\Übungsblätter\bis 2006-12-11>javac Binaerbaum.java -Xlint:unchecked
Binaerbaum.java:28: warning: [unchecked] unchecked cast
found   : Binaerbaum
required: BinaerbaumInterface<Type>
                this.links = (BinaerbaumInterface<Type>) left;
                                                         ^
1 warning

klaro, der Konstruktor hat einen Binaerbaum den er übergibt.
Aber ohne die (BinaerbaumInterface) Klammern gibts dne selben Fehler. Und wenn ich das weglasse passiert was ganz lustiges :wink:
da kommt dann:
found Biaerbauminterface
required BinaerbaumInterface

Irgendwie mag mich die Aufgabe net^^
Grüße und Danke an alle :wink:


Schreib deinen Konstruktor um, denn der nimmt alle Instanzen vom Typ Binaerbaum an und nicht nur die vom Typ BinaerbaumInterface.
Nimm dazu nicht den vom Blatt sondern übernimm den aus dem Interface:

public Binaerbaum(BinaerbaumInterface<Type> left, Type value, BinaerbaumInterface<Type> right)

y0, genau so, dann sollte der Konstruktor auch ohne Fehlermeldung die Typen übernehmen.
Und merci beaucoup @ Der Ich … genau so hab ichs auch verstanden und entsprechend so implementiert.
Schönen Tag@all!