Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Neuer Titel, Altes Prob: Mein Binärbaum (https://www.delphipraxis.net/40428-neuer-titel-altes-prob-mein-binaerbaum.html)

Feechan 15. Feb 2005 18:55


Neuer Titel, Altes Prob: Mein Binärbaum
 
Hallo!
Also ich hab da ein prob das mich schon seit tagen aufregt:
Ich soll einen binär-baum als klasse TBinTree implementieren.
Dazu hab ich eine Klasse TBinTreeNode für einen Knoten des Baumes mit den Eigenschaften
left,right,value (Linker Nachfolger, Inhalt, Rechter Nachfolger).
Außerdem befinden sich in dieser Klasse noch Prozeduren wie zum Beispiel leftinsert, rightinsert, create(l:tbintreenode;v:value;r:tbintreenode) <---- in TBinTreenode (???????)
Die Klasse TBinTree hat die Variable "Root:TbinTreeNode", als Zeiger für die "Wurzel" des Baumes.
Nun will ich die Prozedure leftinsert implementieren und stoße dabei auf ein Problem:
Ich will ein Element der Klasse TBinTreeNode an Root (TbinTree) anhängen. Dabei funktioniet
TBintree.root.left:=neuerknoten;
nicht. Root findet er nicht, sonst alles andere auch nicht. Könntet ihr mir mal helfen?
:wall: :wall: :wall:
:gruebel: :gruebel: :gruebel:
:wiejetzt: :wiejetzt: :wiejetzt:
Fee

Daniel 15. Feb 2005 18:56

Re: HILFE!
 
Hallo und herzlich willkommen in der DP. :dp:

Bitte benutze den Edit-Button (http://www.delphipraxis.net/template.../icon_edit.gif) und gebe Deinem Beitrag einen aussagekräftigen Titel. ;-) Danke Dir.

Binärbaum 15. Feb 2005 19:10

Re: HILFE! BINÄRBAUM ;-P
 
Dazu müsste man wohl mal ein bissl Quelltext sehen (z.B. Deklaration von TBinTreeNode,...), um sagen zu können, woran es liegt.
Wie weit bist du denn schon gekommen?

MfG
Binärbaum

dizzy 15. Feb 2005 19:16

Re: HILFE! Dringed, warum geht das so nicht?
 
Der Titel ist natürlich schon vieeel besser, und so problembeschreibend :). Er sollte auf das eigentliche Problem hinweisen, nicht darauf dass es dringend ist. Das ist hier jede 2. Frage ;)

Binärbaum 15. Feb 2005 19:19

Re: HILFE! Dringed, warum geht das so nicht?
 
Zitat:

Zitat von dizzy
Der Titel ist natürlich schon vieeel besser, und so problembeschreibend :). Er sollte auf das eigentliche Problem hinweisen, nicht darauf dass es dringend ist. Das ist hier jede 2. Frage ;)

Da fand ich den vorherigen Titel "HILFE! BINÄRBAUM ;-P" doch noch besser als "HILFE! Dringed, warum geht das so nicht?". :)

Feechan 15. Feb 2005 19:28

Re: HILFE! Dringed, warum geht das so nicht?
 
habt ja recht ich such den quelltext mal und stell den hier rein, moment^^

Luckie 15. Feb 2005 19:32

Re: HILFE! Dringed, warum geht das so nicht?
 
Du hast den Titekl ja immer noch nicht aussagekräftig gemacht. :warn:

Feechan 15. Feb 2005 19:38

Re: HILFE! Dringed, warum geht das so nicht?
 
Das ist der Quelltext:

Delphi-Quellcode:
unit Unit2;

interface

type tbintreenode=class
private
left,right:tbintreenode;
value:string;
public
constructor create (l: tbintreenode; v:string; r: tbintreenode);
function empty:boolean;
procedure insertLeft(l:tbintreenode);
{procedure insertRight(r:Tbintreenode);
function leftTree:Tbintreenode;
function Righttree:Tbintreenode;
function elem:string;
function count: Integer;
function depth: integer;}
end;

Type TBinTree=class
public
root:tbintreenode;
constructor create;
function empty:boolean;
{function depth:integer;
function count:integer;
destructor destroy;}
end;



implementation

constructor tbintree.create;
begin
root:=tbintreenode.create(Nil,'A',Nil);
end;

function tbintree.empty;
begin
if (root.left=Nil) and (root.right=Nil) then result:=true else result:=false;
end;

//------------------------------------------------

constructor tbintreenode.create(l:tbintreenode; v:string; r:tbintreenode);
begin
left:=l;
right:=r;
value:=v;
end;

function tbintreenode.empty:boolean;
begin

end;

procedure tbintreenode.insertLeft(l:tbintreenode);
var neuerknoten,tl:tbintreenode;
begin
neuerknoten:=l;

if neuerknoten.value=tbintree.root.value then begin

end;
end;

end.
------------------------
ich weiß ist net viel aber unter insertleft wollt ich dann Tbintree.root benutzen, findet der aber net..... oder das im if-teil ist auch ein fehler. warum?
Titel kommt sofort ^^
Fee

[edit=Luckie]Delphi-Tags eingefügt. Beim nächsten Mal bitte selber machen. Mfg, Luckie[/edit]

Binärbaum 15. Feb 2005 19:44

Re: Neuer Titel, Altes Prob: Mein Binärbaum
 
[Edit]
Sorry, war falsch.
[/Edit]

Dust Signs 15. Feb 2005 19:46

Re: Neuer Titel, Altes Prob: Mein Binärbaum
 
Könntest du den Code bitte mal formatieren, der is ja unlesbar. Außerdem: was willst du uns damit
Zitat:

oder das im if-teil ist auch ein fehler. warum?
mitteilen?

Dust Signs

Feechan 15. Feb 2005 19:48

Re: Neuer Titel, Altes Prob: Mein Binärbaum
 
hey, danke!
Wie geht das? dann mach ich es selbst ^^
Fee
P.S.:Schon jemand was entdeckt? ich krieg noch die krise und mein info lehrer ist alles andere als hilfsbereit.... den kann ich nicht fragen :( :( :(
Meine Klassen ignorieren sich gegenseitig, ich weiß auch nicht weiter...

Binärbaum 15. Feb 2005 19:51

Re: HILFE! Dringed, warum geht das so nicht?
 
Zitat:

Zitat von Feechan
ich weiß ist net viel aber unter insertleft wollt ich dann Tbintree.root benutzen, findet der aber net.....

Das kann Delphi nicht finden, da root im TBinTree deklariert ist, die Prozedur, in der du darauf zugreifst aber zu TBinTreeNode gehört.

MfG
Binärbaum

Feechan 15. Feb 2005 19:54

Re: Neuer Titel, Altes Prob: Mein Binärbaum
 
ja ich weiß aber wie soll ich das sonst machen?
Die deklarationen hat mein info-lehrer vorgegeben, hat der sich vertan oder geht das?

Binärbaum 15. Feb 2005 19:59

Re: Neuer Titel, Altes Prob: Mein Binärbaum
 
Zitat:

Zitat von Feechan
ja ich weiß aber wie soll ich das sonst machen?
Die deklarationen hat mein info-lehrer vorgegeben, hat der sich vertan oder geht das?

Vielleicht geht das. Aber ich würde - wenn ich die freie Wahl hätte- das anders lösen.
Man könnte die Deklaration so ändern:
Delphi-Quellcode:
type PBinTree = ^TBinTree;
     TBinTree = record
                 left, right: PBinTree;
                 value: string;
     end;
Demzufolge würde ich die Funktionen für Einfügen usw. seperat schreiben, ohne Klassen zu verwenden. Dann kann man rekursiv auf dem Baum traversieren. Ist meines Erachtens nach einfacher zu implementieren, wenn auch nicht so schön wie mit Klassen.

MfG
Binärbaum

Feechan 15. Feb 2005 20:04

Re: Neuer Titel, Altes Prob: Mein Binärbaum
 
Ja das ist das Prob, ich hab keine wahl.
sonst geht das nicht? das was du geschreiben hast, hatten wir noch nicht :(

Binärbaum 15. Feb 2005 20:09

Re: Neuer Titel, Altes Prob: Mein Binärbaum
 
Tja, wenn das so vorgegeben ist, und du unbedingt im TBinTreeNode auf TBinTree.root zugreifen willst, dann kann man das über einen Zeiger lösen. Dazu übergibst du der Prozedur als zusätzlichen Parameter noch einen Pointer auf TBinTree. Somit kannst du auch darauf zugreifen.
(Was besseres fällt mir im Moment nicht ein.)
[Edit]
Oder darf man die Prozeduren auch nicht ändern?
[/Edit]

Feechan 15. Feb 2005 20:13

Re: Neuer Titel, Altes Prob: Mein Binärbaum
 
meinst du damit, ich soll in der prozedur noch eine variable vom typ TBintreenode (var wurzel:Tbintreenode) deklarieren und dann bsp: Wurzel:=root?
oder wurzel:=tbintree.root?

bttb930 15. Feb 2005 20:14

Re: Neuer Titel, Altes Prob: Mein Binärbaum
 
ach was, VERGISS es!! Fang bloß nicht mit type PBinTreeNode = ^TBinTreeNode an, dein ansatz ist viel besser.

Problem ist dies:

Delphi-Quellcode:
if neuerknoten.value=tbintree.root.value then begin
was ist denn TBinTree? Eine Klasse. Also keine Instanz.

Der Inhalt von InsertLeft könnte wie folgt aussehen:

Delphi-Quellcode:
  Left := L;
fertig, warum willst du irgendwas mit Root prüfen? Wozu braucht die Node überhaupt ein Wissen über die Root?

Binärbaum 15. Feb 2005 20:16

Re: Neuer Titel, Altes Prob: Mein Binärbaum
 
Zitat:

Zitat von Feechan
meinst du damit, ich soll in der prozedur noch eine variable vom typ TBintreenode (var wurzel:Tbintreenode) deklarieren und dann bsp: Wurzel:=root?
oder wurzel:=tbintree.root?

Eigentlich von Typ TBinTree (denn dort ist ja root). Also etwa so:
Delphi-Quellcode:
procedure tbintreenode.insertLeft(l:tbintreenode; var Tree: TBinTree);
var neuerknoten,tl:tbintreenode;
begin
neuerknoten:=l;

if neuerknoten.value=tree.root.value then begin

end;
end;
Das müsste dann funktionieren. Tree muss natürlich der zugehörige TBinTree sein.

Feechan 15. Feb 2005 20:18

Re: Neuer Titel, Altes Prob: Mein Binärbaum
 
Jo danke ich probiers mal aus!
:thumb: :thumb: :thumb:

bttb930 15. Feb 2005 20:22

Re: Neuer Titel, Altes Prob: Mein Binärbaum
 
außerdem warum unterscheidest du zw. TBinTree und TBinTreeNode? Eine Node ist doch ein Baum. Ich würde es so machen:

Delphi-Quellcode:
unit Unit2;

interface

type
  TBinTreeNode = class
  private
    FLeft, FRight: TBinTreeNode;
    FValue: string;
    procedure SetLeft(l: TBinTreeNode);
  public
    constructor Create;
    destructor Destroy; Override;
    function IsEmpty: Boolean;
    property Left: TBinTreeNode read FLeft write SetLeft;
    {property Right und Value ähnlich, außerdem Depth etc)}
  end;

implementation

constructor TBinTreeNode.Create;
begin
  FLeft := nil;
  FRight := nil;
  FValue := '';
end;

destructor TBinTreeNode.Destroy;
begin
  FLeft.Free;
  FRight.Free;
end;

procedure TBinTreeNode.SetLeft(l: TBinTreeNode);
begin
  FLeft := l;
end;

end.

Feechan 15. Feb 2005 20:23

Re: Neuer Titel, Altes Prob: Mein Binärbaum
 
das ist die vorgabe meines info-lehrers ich würds auch ganz anders machen ^^

Binärbaum 15. Feb 2005 20:54

Re: Neuer Titel, Altes Prob: Mein Binärbaum
 
Zitat:

Zitat von Feechan
das ist die vorgabe meines info-lehrers ich würds auch ganz anders machen ^^

Musst du also unbedingt auf
Delphi-Quellcode:
if neuerknoten.value=tbintree.root.value then ...
prüfen?
Falls nein, dann lass' es einfach weg. Man könnte doch auch "einfach so" einfügen, ohne die Wurzel zu überprüfen.
Falls es aber unbedingt sein muss, dann wirst du dir was einfallen lassen müssen (z.B. Zeiger) oder wie auch immer du das lösen willst.

MfG
Binärbaum

PS:
Zitat:

Zitat von Feechan
ich würds auch ganz anders machen ^^

Wie denn? Falls du da schon eine Idee hast, dann versuche doch diese auf die Vorgabe zu übertragen (falls das möglich sein sollte).


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:12 Uhr.

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