Binärbaum rekursiv durchsuchen und Referenz zurückgeben

affot

Mitglied
Hallo zusammen,

ich habe noch Probleme mit der Anwendung von rekursiven Methoden und versuche es mit üben üben üben.
Darum knobel jetzt seit über einer Stunde an meiner mir selbst erlegten Aufgabe rum aber komme einfach nicht auf eine funktionierende Lösung.
Ich möchte einen Binärbaum (Knoten mit int-Werten) durchlaufen und nach einem bestimmten Wert suchen.
Den Baum mit einer void-Methode durchlaufen und sagen auf welcher Ebene sich der Wert befindet (sofern vorhanden) ist kein Problem:
Der main() Aufruft erfolgt mit findRekursiv(baum.wurzel, 'gesuchter Wert',1) mit Start auf Ebene 1.

Code:
    void findRekursiv(Knoten knoten, int wert, int ebene) {
        if (knoten != null) {
            if (knoten.getWert() == wert) {
                System.out.println("Gefunden auf Ebene " + ebene + ".");
            } else {
                findRekursiv(knoten.links, wert, ebene + 1);
                findRekursiv(knoten.rechts, wert, ebene + 1);
            }
        }
    }

Problematisch ist nur hier: Wenn der Wert NICHT vorkommt, wie kann ich das anzeigen? Also ohne bei jedem Aufruf zu sagen "hier nicht gefunden".

Und viel brennender ist für mich die Frage (die in die selbe Richtung geht, denn eine Information muss ja irgendwie durchgereicht werden):
Wie mache ich es, wenn ich gleichzeitg noch eine Referenz auf dieses Element zurückgeben möchte (sofern vorhanden)?

Ich habe schon zig Varianten ausprobiert und poste hier einfach mal meine letzte Version. Es funktioniert insofern, dass ich beim Element ankomme und das in der Console ausgebe. Aber die Referenz wird halt nicht weitergereicht. Ich denke sie wird einmal weitergereicht nur da ich im Rekursionsschritt vorher ja einmal "falsch" abgebogen bin wird aus diesem Weg null weitergereicht, was dann ganz am Ende ankommt.
Also salopp gesagt möchte ich sowas realisieren wie: "Wenn du irgendwo auf deinem Weg mal einen richtigen Knoten erhalten hast dann reiche auf jeden Fall diesen weiter, ansonsten null - aber bevorzuge immer den Knoten".
Aber irgendwie will mir das nicht gelingen.

Code:
   Knoten findRekursiv1(Knoten knoten, int wert, int ebene) {
          if (knoten != null) {
            if (knoten.getWert() == wert) {
                System.out.println("Gefunden auf Ebene " + ebene + ".");
                return knoten;
            } else {
                findRekursiv1(knoten.links, wert, ebene + 1);
                findRekursiv1(knoten.rechts, wert, ebene + 1);
                return null;
            }
        } else {
            return null;
        }
    }
 

LimDul

Top Contributor
Der Code sieht schon mal nicht schlecht aus.

Nur dein else zweig mit den rekursiven Aufrufen passt noch nicht ganz. Die findeRekursiv Aufrufe geben ja einen Wert zurück. Den musst du auswerten und ggf. nach oben durchreichen. Deine Methode hat ja die Semantik:
* Ein Wert ungleich null => Knoten wurde gefunden
* Ein Wert gleich null => Knoten wurde nicht gefunden.

Damit sehe das wie folgt aus:
Java:
   Knoten findRekursiv1(Knoten knoten, int wert, int ebene) {
          if (knoten != null) {
            if (knoten.getWert() == wert) {
                System.out.println("Gefunden auf Ebene " + ebene + ".");
                return knoten;
            } else {
                Knoten links = findRekursiv1(knoten.links, wert, ebene + 1);
                Knoten rechts = findRekursiv1(knoten.rechts, wert, ebene + 1);
                if (links != null) {
                    return links;
                } else {
                    return rechts;
                }
            }
        } else {
            return null;
        }
    }
 

affot

Mitglied
Oh Mann, ich hatte schon alles mit return findRekursiv(...) in if-else Bedingunendurchprobiert, aber auf die links/rechts Idee bin ich nicht gekommen...
Vielen Dank für deine Lösung!

Mein Problem bei den Rekursionen ist einfach noch: Wenn ich sie sehe dann verstehe ich sie, aber selbst drauf kommen gelingt mir noch wirklich häufig nicht... Fällt da irgendwann automatisch der groschen oder gibt es da einen geeigneten Weg wie man es sich methodisch beibringt, so dass man es dann auch selbst anwenden kann?
 

LimDul

Top Contributor
Oft muss man das ein paar mal machen bis man da fitter wird - bei dem einen geht es schneller, beim anderen dauert es länger.

Was helfen kann ist sich komplett vom Code zu lösen und es mal in Prosa zu formulieren.

* Entweder ist der aktuelle Knoten der gesuchte => Gib ihn zurück
* Wenn es nicht der gesuchte ist, schaue links & rechts ob es da der gesuchte Knoten da ist und liefere den zurück.


Und wenn man das dann versucht umzusetzen, kommt man hoffentlich auf eine Lösung ähnlich wie die oben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Binärbaum - von rekursiv zu iterativ Java Basics - Anfänger-Themen 10
Y Wie greift man auf die Knoten in einem Binärbaum zu? Java Basics - Anfänger-Themen 5
T Binärbaum-Suche Implementation Java Basics - Anfänger-Themen 6
D Werte aus einem BinärBaum in einem Array speichern Java Basics - Anfänger-Themen 1
D Binärbaum Blätter finden und Ausgeben Java Basics - Anfänger-Themen 22
O BinärBaum einfügen Java Basics - Anfänger-Themen 13
E Erste Schritte Testklasse Binärbaum Java Basics - Anfänger-Themen 10
void19 Methoden Binärbaum Inorder Traversierung in Array speichern Java Basics - Anfänger-Themen 1
A Größten Eintrag aus Binärbaum löschen Java Basics - Anfänger-Themen 4
L Ganzen BinärBaum ausgeben? Java Basics - Anfänger-Themen 3
L Binärbaum (Stammbaum) Java Basics - Anfänger-Themen 8
S Binärbaum in PreOrder in ArrayList speichern Java Basics - Anfänger-Themen 0
J Methoden Binärbaum, Traversierung in Array speichern Java Basics - Anfänger-Themen 18
K BinärBaum Java Basics - Anfänger-Themen 4
J Max. Anzahl von Knoten im Binärbaum Java Basics - Anfänger-Themen 3
M Werte der Knoten in Binärbaum addieren (iterativ) Java Basics - Anfänger-Themen 6
C Binärbaum mit grafischer Ausgabe Java Basics - Anfänger-Themen 0
J Binärbaum formatiert ausgeben. Java Basics - Anfänger-Themen 7
P Listen sortieren mit Binärbaum gibt keine Ausgabe ab 10000 Integern Java Basics - Anfänger-Themen 14
W Größtes Element im unsortierten Binärbaum Java Basics - Anfänger-Themen 7
N Generischer Binärbaum - löschen Java Basics - Anfänger-Themen 1
M Binärbaum mit parent-Zeigern Java Basics - Anfänger-Themen 1
B Methoden BinärBaum als String Knoten löschen Java Basics - Anfänger-Themen 5
S Binärbaum kopieren Java Basics - Anfänger-Themen 6
B Binärbaum mit java implementieren! Java Basics - Anfänger-Themen 5
D Binärbaum Suche Java Basics - Anfänger-Themen 5
D Binärbaum probleme Java Basics - Anfänger-Themen 4
P Binärbaum - Primärschlüssel Java Basics - Anfänger-Themen 3
X Fehler Binärbaum Java Basics - Anfänger-Themen 6
PaulG Fragen zu Binärbaum Java Basics - Anfänger-Themen 21
N Binärbaum/Implementierung Java Basics - Anfänger-Themen 9
P Binärbaum Ordnungsproblem Java Basics - Anfänger-Themen 8
P Generischer Binärbaum (compareTo Frage) Java Basics - Anfänger-Themen 4
P einen binärbaum implementieren Java Basics - Anfänger-Themen 4
M Binärbaum - Problem bei Knoten anhängen / löschen Java Basics - Anfänger-Themen 5
B Binärbaum höhe herausfinden Java Basics - Anfänger-Themen 12
L Rot Scharz Baum von Binärbaum erben Java Basics - Anfänger-Themen 9
S Klassen Aufgabe: Binärbaum überprüfen Java Basics - Anfänger-Themen 16
S Binärbaum Java Basics - Anfänger-Themen 9
S Variable Parameterliste in Binärbaum Java Basics - Anfänger-Themen 2
N BinärBaum Hilfestellung Java Basics - Anfänger-Themen 8
S Binärbaum prüfen, ob sortiert oder unsortiert Java Basics - Anfänger-Themen 6
W Binärbaum zahlen addieren Java Basics - Anfänger-Themen 7
S Binärbaum - Klasse Knoten - Methode Suchen Java Basics - Anfänger-Themen 5
S Binärbaum Java Basics - Anfänger-Themen 7
I Binärbaum Java Basics - Anfänger-Themen 5
S Bitte um Hilfe beim unsortierten Binärbaum!! Java Basics - Anfänger-Themen 6
J Binärbaum getSize Java Basics - Anfänger-Themen 4
P Fragen zum Binärbaum Java Basics - Anfänger-Themen 3
S Binärbaum implementieren Java Basics - Anfänger-Themen 6
K Tiefe im Binärbaum Java Basics - Anfänger-Themen 2
G generischer binärbaum Java Basics - Anfänger-Themen 9
G Binärbaum und Wrapperklassen Java Basics - Anfänger-Themen 6
F Binärbaum codieren. Codeproblem! Java Basics - Anfänger-Themen 4
D rekursion im binärbaum Java Basics - Anfänger-Themen 11
0 Binärbaum als verkettete Liste Java Basics - Anfänger-Themen 3
T Binärbaum - noch ein "klitzekleiner Fehler" Java Basics - Anfänger-Themen 4
B Binärbaum auf Vollständigkeit prüfen Java Basics - Anfänger-Themen 15
G Frage zur einfügen in einem Binärbaum Java Basics - Anfänger-Themen 21
G Binärbaum grafisch darstellen Java Basics - Anfänger-Themen 4
H Passwort Brute Force rekursiv Java Basics - Anfänger-Themen 7
1 Array rekursiv durchlaufen Java Basics - Anfänger-Themen 8
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
R0m1lly Kombinationen aus int array rekursiv Java Basics - Anfänger-Themen 2
L Rekursiv gegebenes Passwort herausfinden. Java Basics - Anfänger-Themen 2
P9cman Char Index rekursiv finden Java Basics - Anfänger-Themen 4
B Methoden Rekursiv festellen, ob eine Zahl gerade-oft vorkommt oder nicht Java Basics - Anfänger-Themen 4
S Methoden Methodenaufruf rekursiv zählen Java Basics - Anfänger-Themen 4
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
sashady Zahlen rekursiv zerlegen und Ziffern addieren Java Basics - Anfänger-Themen 38
jhCDtGVjcZGcfzug Fibonacci Zahlen rekursiv und iterativ Java Basics - Anfänger-Themen 21
H Binominalkoeffizient tail-rekursiv in java darstellen Java Basics - Anfänger-Themen 0
GAZ Tribonacci Folge Rekursiv Java Basics - Anfänger-Themen 11
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
A Ackermmanfunktion rekursiv Java Basics - Anfänger-Themen 4
H Rekursiv Methode ausführen bei Kindern Java Basics - Anfänger-Themen 12
G Methode Rekursiv umschreiben Java Basics - Anfänger-Themen 8
L Jede zweite Ziffer entfernen (rekursiv) Java Basics - Anfänger-Themen 6
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
D Pentagonale Nummern in Rekursiv Java Basics - Anfänger-Themen 14
O Enum Array Rekursiv abarbeiten Java Basics - Anfänger-Themen 44
E Weg-Suche-Problem rekursiv Java Basics - Anfänger-Themen 12
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
E Erste Schritte Potenz Negativ (rekursiv) Java Basics - Anfänger-Themen 2
O Rekursiv aufrufen Java Basics - Anfänger-Themen 2
F In List Rekursiv suchen Java Basics - Anfänger-Themen 12
F Iterativ in Rekursiv Java Basics - Anfänger-Themen 2
S Fibonacci Zahlen rekursiv Java Basics - Anfänger-Themen 1
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
B Wie kann ich Linien rekursiv zeichnen? Java Basics - Anfänger-Themen 4
kilopack15 Sin(x) rekursiv lösen Java Basics - Anfänger-Themen 17
T Rekursiv Tiefe eines binären Suchbaums ermitteln Java Basics - Anfänger-Themen 22
P Methoden Arrays.AsList kleinste Zahl ausgeben Rekursiv Java Basics - Anfänger-Themen 9
W A hoch N Rekursiv Java Basics - Anfänger-Themen 3
K Rechtecke rekursiv zeichnen Java Basics - Anfänger-Themen 20
V Quadrate rekursiv zeichnen Java Basics - Anfänger-Themen 7
M Fibonacci rekursiv mittels Cache Java Basics - Anfänger-Themen 17

Ähnliche Java Themen

Neue Themen


Oben