Insert()

Easyik

Mitglied
Hey zusammen,

ich hätte mal eine frage bezüglich der insert-Methode.
Und zwar geht es dadrum einen Knoten innerhalb eines Baumes einzufügen, der sich ja nach links oder rechts aufteilt.
Beabsichtigt ist das wenn der linke Zweig bereits besetzt ist aber anhand eines bestimmten Faktors, in diesem Fall ein int-Wert, diesen an das nachfolgende Element links anzuhängen.
Jedoch komme ich nicht dadrauf wie ich das folgende Element ansprechen kann.

Java:
public void insert(Knoten beispielKnoten){
        if(links==null && beispielKnoten.status==0)
        {
            links=beispielKnoten;
        }else if(links!=null && beispielKnoten==0){
            // hier bleibe ich gerade hängen
        }
    }
 
Also so ganz scheint es mir, als ob Du uns wichtige Informationen nicht gibst:
- Was soll status in Knoten sein? Das scheint ja eine Rolle zu spielen.
- Im zweiten if scheint dann wohl ein .status zu fehlen, denn Du wirst da wohl kaum eine Instanz eines Konten mit 0 vergleichen können.

Ansonsten ist die Herangehensweise immer gleich: Spiel es selbst mit Stift und Papier durch! Sowas muss man nicht im Kopf auf magische Weise lösen um dann direkt den Code hin zu schreiben. Und dann erst einmal in Worten beschreiben, was genau getan werden muss.
 
Also so ganz scheint es mir, als ob Du uns wichtige Informationen nicht gibst:
- Was soll status in Knoten sein? Das scheint ja eine Rolle zu spielen.
- Im zweiten if scheint dann wohl ein .status zu fehlen, denn Du wirst da wohl kaum eine Instanz eines Konten mit 0 vergleichen können.

Ansonsten ist die Herangehensweise immer gleich: Spiel es selbst mit Stift und Papier durch! Sowas muss man nicht im Kopf auf magische Weise lösen um dann direkt den Code hin zu schreiben. Und dann erst einmal in Worten beschreiben, was genau getan werden muss.
-Das mit .status hatte an der Stelle gefehlt

um meine Frage etwas zu verdeutlichen:

[wurzel]-->[links]-->[weiteresLinks] (so in etwas habe ich mit den linke Zweig vorgestellt)

es soll ja überprüft werden ob die "wurzel" links einen Eintrag besitzt, falls dies "wahr" ist soll nachgeschaut werden, ob dieses Element "links" ein weiteres Element besitzt.
Falls dies nicht der Fall ist soll da ein Element eingefügt werden.

Nun die Frage: wie Spreche ich "links" am besten an
 
Zuletzt bearbeitet:
Du sprichst das ja schon an: In dem Code, den Du geteilt hast, sieht man ja die Variable links. Das dürfte die Instanzvariable für den linken Teilbaum sein.

Und da wird es dann ja wieder ein links geben.

Und generell gibt es zwei Wege, wie man vorgehen kann. Dazu verwende ich einfach einmal das Beispiel: Durch den Zug nach hinten gehen (ans Ende gehen):
a) Rekursiv:
ans Ende gehen:
- Wenn am Waggon noch ein Waggon hängt: nächster Waggon - gehe ans Ende <-- Rekursiver Aufruf
- sonst: fertig

b) iterativ mit einer Hilfsvariable:
temp Variable ist der aktuelle Waggon.
So lange temp.nächster nicht null ist: temp = temp.nächster

Beides lässt sich auf dein aktuelles Problem adaptieren.
 
So ein kleines Update zur Methode:

Java:
public void insert(String eingabe, int status){
        if(links==null){
            Knoten root  = new Knoten(eingabe,status);
            links=root;
        }else if(links!=null){
            links.links=new Knoten(eingabe,status);
        }
    }

- jedoch wird diesmal die dritte Eingabe von der vierten Eingabe überspeichert -.-

kann mir jemand sagen wo der Fehler liegt
 
Du prüfst nicht, ob links.links "leer" ist.

Daher: mal dir die Fälle auf und überlege einfach einmal, wie Du vorgehen musst.

Sprich: Stift und Zettel. Am Anfang hast Du einen leeren Knoten. Dann kommt der erste Insert, links ist noch leer, also kommt da der Knoten hin. Und dann immer weiter.

Wenn Du es durchspielst, dann solltest Du ein universelles Vorgehen finden. Zumal du zwei mögliche Vorgehen auch schon bekommen hast.
 
Du prüfst nicht, ob links.links "leer" ist.

Daher: mal dir die Fälle auf und überlege einfach einmal, wie Du vorgehen musst.

Sprich: Stift und Zettel. Am Anfang hast Du einen leeren Knoten. Dann kommt der erste Insert, links ist noch leer, also kommt da der Knoten hin. Und dann immer weiter.

Wenn Du es durchspielst, dann solltest Du ein universelles Vorgehen finden. Zumal du zwei mögliche Vorgehen auch schon bekommen hast.
Habe es jetzt mit schleifen versucht bin aber nach wie vor nicht schlauer geworden 🙃
Könnte ich eventuell noch einen Tipp haben bitte
 
Wenn Du es mit einer Schleife machen willst, dann wäre das die Methode, die ich mit iterativ beschrieben habe:
temp Variable ist der aktuelle Waggon.
So lange temp.nächster nicht null ist: temp = temp.nächster
Jetzt müsste man nur schauen, was wäre bei Dir der Gegenpart von einem Waggon? Das bedeutet bei Dir "nächster Waggon". Dann kannst Du es direkt 1:1 so abbilden.

Wichtig ist: Du brauchst die Hilfsvariable, mit dieser läufst Du durch, bis Du ein Element gefunden hast, das eine bestimmte Bedingung erfüllt und schon kannst du dann auf diesem Element etwas machen.
 
Wenn Du es mit einer Schleife machen willst, dann wäre das die Methode, die ich mit iterativ beschrieben habe:

Jetzt müsste man nur schauen, was wäre bei Dir der Gegenpart von einem Waggon? Das bedeutet bei Dir "nächster Waggon". Dann kannst Du es direkt 1:1 so abbilden.

Wichtig ist: Du brauchst die Hilfsvariable, mit dieser läufst Du durch, bis Du ein Element gefunden hast, das eine bestimmte Bedingung erfüllt und schon kannst du dann auf diesem Element etwas machen.
würde das gerne Rekusiv hinkriegen habe und habe wie empfohlen mich hingesetzt und es aufgezeichnet.

Am ende komme ich entweder bei einem endlosen Selbstaufruf raus oder bei einer endlosen Aneinanderreihung von links.links.links......
Java:
public void insert(String eingabe, int status){
    if(links==null){
        Knoten root  = new Knoten(eingabe,status);
        links=root;
    }else if(links!=null){

        if(links.links==null){
            links.links=new Knoten(eingabe,status);
                
        }else if(links.links.links==null){
            links.links.links=new Knoten(eingabe,status);//// und so weiter
        }
    }
    
}

Ich bräuchte einen Basisfall um die Rekursion irgendwann abbrechen zu lassen, komme allerdings auf keine Sinnvolle Idee 🙂
 
Da ist doch jetzt keine Rekursion. Rekursion ist, wenn eine Methode sich selbst (ggf. indirekt) aufruft.

Die Formulierung dazu wäre:
Insert auf einem Knoten:
- Link frei? Dann: Links setzen und fertig (==> Abbruchbedingung - dieses ist ein wichtiger Punkt bei Rekursion)
- Sonst: auf linkem Knoten insert (rekursiv) aufrufen. (==> Rekursiver Aufruf)
 
Da ist doch jetzt keine Rekursion. Rekursion ist, wenn eine Methode sich selbst (ggf. indirekt) aufruft.

Die Formulierung dazu wäre:
Insert auf einem Knoten:
- Link frei? Dann: Links setzen und fertig (==> Abbruchbedingung - dieses ist ein wichtiger Punkt bei Rekursion)
- Sonst: auf linkem Knoten insert (rekursiv) aufrufen. (==> Rekursiver Aufruf)
hatte die Rekursion wieder raus genommen um zu zeigen worauf ich hinaus will XD
 
[CODE lang="java" title="Mission completed"]public void insert(String eingabe, int status){
if(links==null){
links = new Knoten(eingabe,status);

}else if(links!=null){

links.insert(eingabe, status);;
}[/CODE]
 
Das sieht doch schon super aus.

Nur ein Hinweis: Das zweite if brauchst Du nicht mehr. Es gibt ja nur zwei Möglichkeiten: Entweder links ist null oder es ist eben nicht null.
Daher reicht das erste if zusammen mit dem Else.

Das ist also so wie bei Gesprächen: "Gehst Du heute Abend mit ins Kino?"
Wenn Du da nein sagst, dann ist ja klar: Du kommst nicht mit ins Kino, daher muss ich nicht noch einmal fragen: "Gehst Du heute Abend nicht mit ins Kino?"
 

Neue Themen


Zurück
Oben