Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Binärbaum - Problem: StackOverflow (https://www.delphipraxis.net/114220-binaerbaum-problem-stackoverflow.html)

DerKaeptn 21. Mai 2008 16:23


Binärbaum - Problem: StackOverflow
 
Hiho,
ich weiß, dass es schon gaaanz viele Binärbaumthreads gibt, aber keienr behandelt das Probelm von mir xD Und dazu finden kann ich nichts, da es einfach zu speziell ist =/
Es geht um folgendes:
Ich soll einen Binärbaum erstellen. Dabei erstelle ich bei FormCreate zuerst die Wurzel, genannt "Baum". Nun würde ich gerne einen IntegerWert in den Baum einfügen, indem ich eben Kinder erstelle, die entweder links des oberen Teilbaums (wenn kleiner) oder rechts (wenn größer) angeordnet sind. Dann beginnt jedochd as Schlammassel. Erst lese ich in der GUI einen Wert aus einem Edit Feld und überge diesen Parameter an die Fachklasse TBBaum. Dort habe ich meine Funktion Einfuegen.

Delphi-Quellcode:
procedure TBBaum.Einfuegen (n: Integer);          
begin
    if gibschluessel>n then                        
      begin
      if giblinks <> nil then
        giblinks.Einfuegen(n)                      
      else
        setzelinks(create(n))                        
      end
    else
      begin
      if gibschluessel<n then                      
        begin
        if gibrechts <> nil then                      
          gibrechts.Einfuegen(n)
        else                                    
          setzerechts(create(n));
        end;
      end;
end;
Schluessel ist hierbei immer der jeweilige Integerwert, der im Teilbaumg espeichert werden soll.
Wenn ich das Programm mit F7 durchlaufen lasse, passiert eben das merkwürdige, dass er (angenommen der Schlüssel des aktuellen Baumes ist 5, und ich will eine 7 einfügen) er sagt: Okay, der Schöüssel ist <n (stimmt ja), dann schaut er ob rechts NIL ist (ja), aber er trotzdem wieder rekursiv das Einfuegen aufruft. =/
Ich habe sogar extra beim Creator hinzugeschrieben:
Delphi-Quellcode:
constructor TBBaum.Create (n: Integer);
begin
  inherited create;      
  setzeschluessel(n);  
  setzelinks(nil);
  setzerechts(nil);
end;
womit sogar fetgelegt wird, dass kein Nachfolger exisitert.
Ich hoffe man kann mir helfen^^ Ich sitze ejtzt schon 1 Woche an dem Problem und mein Informatik Lehrer sieht den Fehler auch nicht xD

shmia 21. Mai 2008 17:26

Re: Binärbaum - Problem: StackOverflow
 
Delphi-Quellcode:
procedure TBBaum.Einfuegen (n: Integer);          
begin
    if gibschluessel>n then                        
      begin
      if giblinks <> nil then
        giblinks.Einfuegen(n)                      
      else
        // Wenn du denkst, dass der Aufruf von create(n) ein neues Objekt erzeugt, liegst du falsch !!
        setzelinks(create(n))                        

        setzelinks(TBBaum.create(n)) // So wird ein neues Objekt erzeugt      
...
Der Konstruktor Create hat 2 verschiedene Aufrufmodi:
Bei TKlasse.Create wird ein neues Objekt erzeugt und anschliesend die Konstruktor-Methode aufgerufen.
Bei self.Create wird nur die Konstruktor-Methode aufgerufen.

DerKaeptn 21. Mai 2008 18:34

Re: Binärbaum - Problem: StackOverflow
 
Ich danke wirklich sehr =) Du warst meine Rettung! Vielen vielen dank^^ Da wär ich auch nie drauf gekommen


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz