Rekursive Suche in einem Baum

Moch

Bekanntes Mitglied
Hallo,
Tut mir leid so eine vermutlich simple Frage zu stellen, aber ich bin so langsam total am verzweifeln.

Folgendes Problem:
Ich habe einen Binär-Baum, dessen Blätter/Knoten bestimmte Merkmale enthalten. Derzeit brauche ich eine Such-Function, die rekursiv ein Blatt mit einer bestimmten Eigenschaft sucht.

Vereinfachtes Beispiel:
- Der Baum beinhaltet in jedem Knoten/Blatt einen Character (keine duplikate) und eine ID für diesen

Ich suche nun nach der ID für einen Char, als muss ich besagten charakter im baum finden.

Leider kriege ich die verdammte Rekursion überhaupt gar nicht mehr hin und weiß nicht warum.
Ich komme immer wieder nur auf null-Pointer oder nur den äußerst linken Knoten raus.

Könnte mir einer in Pseudecode nochmal verdeutlichen, wie ich diese rekursive Suche aufbauen muss, damit alle Knoten durchsucht werden bzw. solange gesucht wird, bis der passende gefunden wurde.
Vielleicht starre ich einfach schon zu lange auf den Quelltext (muss zeitig fertig werden) und stelle mich deswegen dumm an.
Egal, was ich auch anstelle, entweder gibt die function überall null zurück oder gibt nur den äußerst linken Knoten zurück.
Logisch ist also, dass meine Ansätze ins leere laufen, oder aber die rechten teilbäume nicht mehr ablaufen...

liebe Grüße
ein verzweifelter Moch

Edit: genutzt sprache ist Ada95, aber ich verstehe auch den Quellcode von Java, Delphi und Haskell sehr gut... Ada95 ist Delphi sehr ähnlich.
 
Zuletzt bearbeitet:

XHelp

Top Contributor
Könnte so ähnlich wie das da aussehen:
Code:
public IdDatenTyp suche(Knoten k, char c) {
  if (k==null) {
    return null;
  }
  if (k.getChar()==c) {
    return k.getID();
  }
  IdDatenTyp id = suche(k.getLinkerKnoten(), c);
  if (id!=null) {
    return id;
  }
  return suche(k.getRechterKnoten(),c);
}
 

Moch

Bekanntes Mitglied
Irgendwie stehe ich trotzdem auf dem schlauch... vielleicht kannst Du hier den Fehler finden?

der HuffmanTree besteht aus folgendem:
Char: Character;
Anz: Integer; -- gibt Anzahl an
left: Huffmantree:
right: HuffmanTree;
Code: unbounded_String;

(Ada ist NICHT caseSensitiv)
Der zugehörige Baum sieht in etwa wie folgt aus
# sind nur Knoten, die hierbei nicht beachtet werden müssen

Code:
   #-------------------#
   |                           |
u---f                    #-----------#
                          |                  |
                       a -- h           m -- n

Code:
   FUNCTION FindNode(Huff: HuffmanTree; C: Character) RETURN HuffmanTree is
      HT: Huffmantree := Huff;
      CS: Character := C;
      HR: Huffmantree;
      HS: Huffmantree := huff;

      begin
         IF(Ht.Char = Cs) THEN
            RETURN Ht;
         END IF;
         
         IF(Ht.Left /= NULL) THEN
            Hr := FindNode(Ht.Left, Cs);
         END IF;
         IF(Hr /= NULL) THEN
            RETURN Hr;
         END IF;
         
         ht:= hs;
         IF(Hr = NULL) THEN
            IF(Ht.Right /= NULL) THEN
               Hr := FindNode(Ht.Right, Cs);
            END IF;
            
         END IF;
         
         IF(Hr /= NULL) THEN
            RETURN Hr;
         END IF;
         
         IF(Hr = NULL) THEN
            RETURN NEW HuffmanTreeNode'('/', 0, NULL, NULL, To_Unbounded_String("FAILED"));
         END IF;
         

      end findNode;

Ich kriege immer nur das u ausgegeben... der Rest sind null-Pointer... ich finds einfach nicht mehr raus -.-
 

Moch

Bekanntes Mitglied
Das Problem hat sich gelöst.
Habe jetzt einen Zähler eingebaut, der den Dummy nur dann erzeugt, wenn der zähler > 2 ist ... bei jedem Rekursionsschritt wird dieser um 1 erhöht.

Hier meine funtkionierende Function, falls noch wer auf dieses Problem stößt.

Danke für Deine Mithilfe :)

Code:
   FUNCTION FindNode(Huff: HuffmanTree; C: Character; Counter: Integer) RETURN HuffmanTree is
      HT: Huffmantree := Huff;
      CS: Character := C;
      HR: Huffmantree;
      HS: Huffmantree := Huff;
      Count : Integer := Counter +1;

      begin
         IF(Ht.Char = Cs) THEN
            RETURN Ht;
         END IF;
         
         IF(Ht.Left /= NULL) THEN
            Hr := FindNode(Ht.Left, Cs, Count);
         END IF;
         IF(Hr /= NULL) THEN
            RETURN Hr;
         END IF;
         
         ht:= hs;
         IF(Hr = NULL) THEN
            IF(Ht.Right /= NULL) THEN
               Hr := FindNode(Ht.Right, Cs, Count);
            END IF;
            
         END IF;
         
         IF(Hr /= NULL) THEN
            RETURN Hr;
         END IF;
         
         IF(Hr = NULL) THEN
            if(count < 2) then
               RETURN NEW HuffmanTreeNode'('/', 0, NULL, NULL, To_Unbounded_String("FAILED"));
               end if;
         END IF;
         return null;

      end findNode;
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Suche Ideen zu Verteilung von Updates Softwareentwicklung 7
M Pseudocode der Exponentiellen Suche Softwareentwicklung 0
S Suche: (Versionierungs)Tool für Klassenaustausch mit Kollegen, die auch an dem Projekt arbeiten Softwareentwicklung 5
J Suche noch eine Loesung fuer Kommunikation zwischen Webserver und ein Programm Softwareentwicklung 0
R Suche Einbinden Softwareentwicklung 12
Gossi Ruby: Suche durch Datein Softwareentwicklung 4
M Suche Task-Software (Groupware mit Anpassungsmöglichkeiten) Softwareentwicklung 3
M Suche das "optimale" Web-Framework... Softwareentwicklung 6
O [Suche] sinnvolle BadWord-Liste Softwareentwicklung 8
Quaxli Suche Tutorial für Jasper Report - speziell iReport Softwareentwicklung 8
K Suche freies UML Tool um aus .java dateien Diagramme zu. Softwareentwicklung 8
S binaere Suche Verstaendnisproblem Softwareentwicklung 3
G Suche Ajax Javascript library Softwareentwicklung 10
G Suche Programm für Masken Design für Pflichtenheft Softwareentwicklung 5
G Suche UML Aufgaben mit Lösungen zum Übem Softwareentwicklung 2
K Suche nach regulärem Ausdruck Softwareentwicklung 5
T Suche: Informationen über Online Ticketing Softwareentwicklung 4
T Suche A Star Java Beispielprogramm Softwareentwicklung 2
B Suche Latex-Editor Softwareentwicklung 15
C JPA Entities in einem Klassendiagramm ? Softwareentwicklung 0
J Vorname und Nachname aus einem String bestimmen Softwareentwicklung 12
D Wie entwickelt ihr gute Software mit einem GUI? Softwareentwicklung 29
D Frage zu meiner Vorgehensweise in einem Projekt Softwareentwicklung 5
G Wie viel/wenig Schlafenszeit kann ich einem Thread zutrauen? Softwareentwicklung 3
G Genauigkeit in einem Universum Softwareentwicklung 4
G Bitte Hilfe für mySQL in einem Query Softwareentwicklung 7

Ähnliche Java Themen

Neue Themen


Oben