AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Binärbaum preorder Algorithmus

Ein Thema von Fehlersucher · begonnen am 10. Nov 2012 · letzter Beitrag vom 11. Nov 2012
Antwort Antwort
Seite 1 von 2  1 2      
Fehlersucher

Registriert seit: 10. Nov 2012
32 Beiträge
 
#1

Binärbaum preorder Algorithmus

  Alt 10. Nov 2012, 19:08
Hallo,

ich soll einen (rekursiven) Algorithmus schreiben um einen Binärbaum der Klasse TBinaryTree nach dem preorder Algorithmus zu durchlaufen. Der Baum soll dann in einem String wiederzufinden sein, welcher später in einem Edit angezeigt wird.

Dazu darf ich nur die Befehle nutzen, welche auf Seite 12 zu finden sind:
http://www.standardsicherung.nrw.de/....php?file=3181

Nun habe ich schon das hier geschafft:

Anmerkung:
In den Wurzelknoten/Blättern etc. wurden Objekte gespeichert, welche später in Strings umgewandelt werden müssen, was nach dem Schema unten auch richtig funktioniert und für den Algorithmus nebensächlich ist.

Durch die Kettenklasse wird aus dem Objekt der String.

Code:

  function TBaumklasse.preorderfunc(baum:TBinaryTree):string;
  var
      x, Text : string;
  begin
  if baum.isEmpty = false then
   begin
    x := Kettenklasse(baum.getobject).gibString; // Bis hier wurde das Objekt in einen String umgewandelt
    Text := Text + x;
    preorderfunc(baum.getLeftTree);
    preorderfunc(baum.getRightTree);
     result := Text;
   end;
   
   end;
Unglücklicherweise funktioniert die Funktion gar nicht richtig.
Ich bekomme als result immer nur den String eines Objekts bzw. Wurzelknotens raus.

Was ist bei mir falsch?

Gruß
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Binärbaum preorder Algorithmus

  Alt 10. Nov 2012, 19:41
Wenn du eine Funktion rekursiv aufrufst dann musst du auch das Ergebnis der Funktion entgegennehmen!
Delphi-Quellcode:
function TBaumklasse.preorderfunc(baum:TBinaryTree):string;
var
   x, Text : string;
begin
  if not baum.isEmpty then
  begin
    Result := Kettenklasse(baum.getobject).gibString; // Bis hier wurde das Objekt in einen String umgewandelt
    Result := Result + '[' + preorderfunc(baum.getLeftTree) + ']';
    Result := Result + '[' + preorderfunc(baum.getRightTree) + ']';
  end
  else Result := '';
end;
  Mit Zitat antworten Zitat
Fehlersucher

Registriert seit: 10. Nov 2012
32 Beiträge
 
#3

AW: Binärbaum preorder Algorithmus

  Alt 11. Nov 2012, 12:10
Danke für deine Hilfe.

Leider funktioniert es immer noch nicht.

Ich habe meinen Code durch deine Verbesserung ersetzt.

Es wird aber (wie vorher) nur der String eines Objektes angezeigt.


Wenn ich die Funktion aufrufe (und den Binärbaum noch nicht durchschritten habe) wird (nur) der erste Wurzelknoten angezeigt.
Wenn ich jedoch den Binärbaum durchschreite und beispielsweise am dritten Wurzelknoten angekommen bin, wird nach dem Funktionsaufruf (nur) der dritte Wurzelknoten angezeigt.

Woran kann das liegen?

Gruß
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Binärbaum preorder Algorithmus

  Alt 11. Nov 2012, 13:28
Es wird aber (wie vorher) nur der String eines Objektes angezeigt.
WO wird der String angezeigt? Im Debugger der IDE?

Es kommt immer drauf an, wo man den Breakpoint setzt.
Ausserdem ist das Debuggen von rekursiven Funktionen nicht so einfach.
Man verliert sehr leicht den Überblick auf welcher Aufruftiefe man sich bewegt.
Mit einer kleinen Erweiterung (Parameter level) kann man die Tiefe der rekursiven Aufrufe mitzählen:
Delphi-Quellcode:
function TBaumklasse.preorderfunc(baum:TBinaryTree; level:Integer):string;
begin
  if not baum.isEmpty then
  begin
    Result := Kettenklasse(baum.getobject).gibString;
    Result := Result + '[' + preorderfunc(baum.getLeftTree, level+1) + ']';
    Result := Result + '[' + preorderfunc(baum.getRightTree,level+1) + ']';
  end
  else Result := '(empty)'; // zum Test um leere Knoten zu entdecken
end;

Geändert von sx2008 (11. Nov 2012 um 13:34 Uhr)
  Mit Zitat antworten Zitat
Fehlersucher

Registriert seit: 10. Nov 2012
32 Beiträge
 
#5

AW: Binärbaum preorder Algorithmus

  Alt 11. Nov 2012, 14:17
Es wird aber (wie vorher) nur der String eines Objektes angezeigt.
WO wird der String angezeigt? Im Debugger der IDE?
Nein im Edit.

Ich rufe die Funktion so auf:

Delphi-Quellcode:
function TBaumklasse.make:string
begin
result := preorderfunc(Hauptbaum);
end;

// dann in anderer unit auf eine Buttonclick Methode:
Edit1.text := Hauptform.make
Ich musste noch die Funktion make machen, da der Hauptbaum in einer anderen unit nicht bekannt ist und daher das nicht ginge:

Edit1.text := preorderfunc(Hauptbaum)
Gruß
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Binärbaum preorder Algorithmus

  Alt 11. Nov 2012, 15:20
Wenn dein Baum effektiv nur aus einem Knoten besteht, dann wird auch nur ein Knoten angezeigt.
Wenn die Funktion gibString() in manchen Fällen einen leeren String liefert, dann sind die Knoten quasi unsichtbar obwohl sie da sind.
Um leere Knoten erkennen zu können dann kannst du die Funktion aus Beitrag #4 verwenden.

Ein Baum mit einem Knoten würde dann so in einen String übersetzt:
Code:
Name123[(empty)][(empty)]
  Mit Zitat antworten Zitat
Benutzerbild von entwickler
entwickler

Registriert seit: 16. Feb 2011
Ort: Herten
78 Beiträge
 
Delphi 5 Professional
 
#7

AW: Binärbaum preorder Algorithmus

  Alt 11. Nov 2012, 15:22
Hallo zusammen

@Fehlersucher: Mensch hast du ein Glück!!! Wir machen genau dasselbe in Informatik. Letzte Woche haben wir die Komplettlösung unseres Lehrers bekommen (Wir sollen den Baum jetzt nämlich sortieren lassen, aber das funktioniert noch nicht).
Das Projekt wurde mit Lazarus geschrieben, aber du kannst dir die einzelnen Prozeduren/ Funktionen einfach aus den Units herauskopieren . Diese funktionieren auch (soweit ich weiss) alle rekursiv (unser Lehrer bestand darauf).
Die Aufrufe "Get~" belegen den Baum im entsprechenden Verfahren (Pre-, Post- oder Inorder), die Aufrufe "Set~" geben den Bauminhalt (also dessen Knotendaten) im gewünschten Auslesenverfahren wieder aus.

Weitere Fragen kannst du gerne an mich stellen
Angehängte Dateien
Dateityp: zip Binaerbaum_Projekt.zip (559,2 KB, 11x aufgerufen)
Traue einem PC nur soweit, wie du ihn werfen kannst.

Geändert von entwickler (11. Nov 2012 um 16:02 Uhr) Grund: Rechtschreibfehler
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#8

AW: Binärbaum preorder Algorithmus

  Alt 11. Nov 2012, 15:33
Ist das euer Code oder der des Lehrers?
Manche Lehrer/Dozenten/Institutionen drücken mithilfe des Urheberrechts durch, dass die Lösungen ihrer Aufgaben nicht im Netz zu finden sind. Also Vorsicht mit so etwas.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#9

AW: Binärbaum preorder Algorithmus

  Alt 11. Nov 2012, 15:36
Mensch hast du ein Glück!!!
Naja, Glück ist wenn man das Thema verstanden und umgesetzt hat und später für die eigene Leistung eine gute Note bekommt.
Fremde Projekte kopieren und als eigene Leistung auszugeben ist geschummelt.
  Mit Zitat antworten Zitat
Benutzerbild von entwickler
entwickler

Registriert seit: 16. Feb 2011
Ort: Herten
78 Beiträge
 
Delphi 5 Professional
 
#10

AW: Binärbaum preorder Algorithmus

  Alt 11. Nov 2012, 15:53
@BUG: Das ist der Code, den wir zusammen als Kurs erarbeitet haben und den unser Lehrer dann nochmal für jeden zusammengestellt hat.

@sx2008: Naja, mit deiner Kernaussage hst du irgendwie recht. Ich denke aber nicht, dass Fehlersucher das ganze Projekt gleich vollständig übernimmt, weil sich das Sortierverfahren (ohne Änderungen vorzunehmen) nur auf den von uns implementierten Binärbaum anwenden lässt. Die Eigenleistung besteht, denke ich, darin, die Funktionen/ Prozeduren dann an den eigenen Baum anzupassen
Sry, wenn das falsch rübergekommen ist
Traue einem PC nur soweit, wie du ihn werfen kannst.

Geändert von entwickler (11. Nov 2012 um 16:01 Uhr) Grund: Rechtschreibfehler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:21 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