Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit BaumKlasseUnit;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Generics.Collections,
- Vcl.ComCtrls;
- type
- PNode = ^TNodeTest;
- TNodeTest = class
- private
- FDaten: String;
- FLinks: PNode;
- FRechts: PNode;
- FTreeNode: TTreeNode;
- public
- constructor Create;
- end;
- TForm4 = class(TForm)
- Lb_Ausgabe: TLabel;
- Ed_Eingabe: TEdit;
- Bt_Einfuegen: TButton;
- Bt_Links: TButton;
- Bt_Rechts: TButton;
- Bt_Loeschen: TButton;
- Bt_Wurzel: TButton;
- Bt_Aendern: TButton;
- Bt_NodeZaehlen: TButton;
- Bt_BlaetterZaehlen: TButton;
- Bt_Tiefe: TButton;
- TV: TTreeView;
- procedure FormCreate(Sender: TObject);
- procedure Bt_EinfuegenClick(Sender: TObject);
- procedure Bt_RechtsClick(Sender: TObject);
- procedure Bt_WurzelClick(Sender: TObject);
- procedure StatusBt;
- procedure Bt_LoeschenClick(Sender: TObject);
- procedure Bt_AendernClick(Sender: TObject);
- procedure Einfuegen(eingabe: String);
- procedure SetErgebnis(daten: TStringList);
- procedure Bt_NodeZaehlenClick(Sender: TObject);
- procedure Bt_BlaetterZaehlenClick(Sender: TObject);
- function GetErgebnis(): TStringList;
- function Durchgelaufen(): Boolean;
- function Hoehe(p: PNode): Integer;
- procedure Bt_TiefeClick(Sender: TObject);
- procedure Ed_EingabeKeyPress(Sender: TObject; var Key: Char);
- procedure TVMouseUp(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- procedure AktuallisiereMaus;
- procedure Bt_LinksClick(Sender: TObject);
- procedure EinzelnerKnotenLoeschen;
- private
- { Private-Deklarationen }
- {PWurzelNode: PNode;
- PStandNode: PNode;
- PParentNode: PNode;
- eingegeben, bearbeiten: Boolean;}
- PWurzelNode: PNode;
- PStandNode: PNode;
- PParentNode: PNode;
- eingegeben, bearbeiten: Boolean;
- public
- { Public-Deklarationen }
- end;
- var
- Form4: TForm4;
- implementation
- {$R *.dfm}
- constructor TNodeTest.Create;
- begin
- inherited Create; //hierdurch wird der ursprüngliche Konstruktor aufgerufen
- end;
- procedure TForm4.Bt_AendernClick(Sender: TObject);
- var
- eingabe: String;
- begin
- if Tag = 0 then
- begin
- Ed_Eingabe.Text := PStandNode.FDaten;
- (Sender as TButton).Caption := 'Ändern (Reinschreiben)';
- Tag := 1;
- bearbeiten := True;
- end
- else if Tag = 1 then
- begin
- eingabe := Ed_Eingabe.Text;
- EinzelnerKnotenLoeschen;
- Einfuegen(eingabe);
- Ed_Eingabe.Text := '';
- (Sender as TButton).Caption := 'Ändern (Einlesen)';
- Tag := 0;
- bearbeiten := False;
- end;
- end;
- procedure TForm4.Bt_BlaetterZaehlenClick(Sender: TObject);
- var
- Stack: TStack<PNode>;
- PBufferNode: PNode;
- i: Integer;
- begin
- if PWurzelNode <> nil then
- begin
- Stack := TStack<PNode>.Create;
- i := 0;
- PBufferNode := PWurzelNode;
- if ((PWurzelNode.FLinks <> nil) and (PWurzelNode.FRechts <> nil)) then
- begin
- Stack.Push(PBufferNode);
- PBufferNode := PBufferNode.FLinks;
- end;
- if Stack.Count <> 0 then
- begin
- repeat
- begin
- if ((PBufferNode.FLinks <> nil) and (PBufferNode.FRechts <> nil)) then
- begin
- if (Stack.Count = 0) or (Stack.Peek <> PBufferNode) then
- begin
- Stack.Push(PBufferNode);
- end;
- PBufferNode := PBufferNode.FLinks;
- end
- else if PBufferNode.FRechts <> nil then
- begin
- PBufferNode := PBufferNode.FRechts;
- end
- else if PBufferNode.FLinks <> nil then
- begin
- PBufferNode := PBufferNode.FLinks;
- end
- else
- begin
- Inc(i);
- PBufferNode := Stack.Peek;
- Stack.Extract;
- Stack.TrimExcess;
- PBufferNode := PBufferNode.FRechts;
- if (PBufferNode.FLinks <> nil) and (PBufferNode.FRechts <> nil) then
- begin
- Stack.Push(PBufferNode);
- end;
- end;
- end;
- until Stack.Count = 0;
- end;
- if (PBufferNode.FLinks = nil) and (PBufferNode.FRechts = nil) then
- begin
- Inc(i);
- end;
- Stack.Clear;
- Stack.Free;
- if i = 1 then
- begin
- ShowMessage('Es gibt ' + IntToStr(i) + ' Blatt!');
- end
- else
- begin
- ShowMessage('Es gibt ' + IntToStr(i) + ' Blätter!');
- end;
- end;
- end;
- procedure TForm4.Bt_EinfuegenClick(Sender: TObject);
- begin
- Einfuegen(Ed_Eingabe.Text);
- //TVEinfuegen(Ed_Eingabe.Text);
- Ed_Eingabe.Text := '';
- Ed_Eingabe.SetFocus;
- end;
- procedure TForm4.Ed_EingabeKeyPress(Sender: TObject; var Key: Char);
- begin
- if Key = #13 then
- begin
- if bearbeiten then
- begin
- Bt_Aendern.Click;
- end
- else
- begin
- Bt_Einfuegen.Click;
- end;
- Key := #0; //Ist das nötig?
- end;
- end;
- procedure TForm4.Einfuegen;
- var
- PCurrentNode: PNode;
- TCurrentNodeTest: TNodeTest;
- PBufferNode: PNode;
- durchlaufe: Boolean;
- begin
- // PCurrentNode := nil;
- TCurrentNodeTest := TNodeTest.Create; //Neuer Node erzeugen
- New(PCurrentNode);
- PCurrentNode.FDaten := eingabe;
- PCurrentNode.FLinks := nil;
- PCurrentNode.FRechts := nil;
- PBufferNode := PWurzelNode;
- if PWurzelNode = nil then
- begin
- PWurzelNode := PCurrentNode;
- PWurzelNode.FTreeNode := TV.Items.AddChildObject(nil, 'Wurzel: ' + PWurzelNode.FDaten, PWurzelNode);
- PStandNode := PWurzelNode;
- Lb_Ausgabe.Caption := PWurzelNode.FDaten;
- Bt_Wurzel.Enabled := True;
- end
- else
- begin
- durchlaufe := True;
- while durchlaufe do
- begin
- if (eingabe <= PBufferNode.FDaten) and (PBufferNode.FLinks <> nil) then
- begin
- PBufferNode := PBufferNode.FLinks;
- end
- else if (eingabe > PBufferNode.FDaten) and (PBufferNode.FRechts <> nil) then
- begin
- PBufferNode := PBufferNode.FRechts;
- end
- else
- begin
- durchlaufe := False;
- end;
- end;
- if PBufferNode.FDaten >= eingabe then
- begin
- PCurrentNode.FTreeNode := TV.Items.AddChildObject(PBufferNode.FTreeNode, 'l: ' + PCurrentNode.FDaten, PCurrentNode);
- PBufferNode.FLinks := PCurrentNode;
- end
- else
- begin
- PCurrentNode.FTreeNode := TV.Items.AddChildObjectFirst(PBufferNode.FTreeNode, 'r: ' + PCurrentNode.FDaten, PCurrentNode);
- PBufferNode.FRechts := PCurrentNode;
- end;
- end;
- StatusBt;
- TV.FullExpand;
- end;
- procedure TForm4.Bt_LinksClick(Sender: TObject);
- begin
- PStandNode.FTreeNode.Selected := False;
- PParentNode := PStandNode;
- PStandNode := PStandNode.FLinks;
- PStandNode.FTreeNode.Selected := True;
- Lb_Ausgabe.Caption := PStandNode.FDaten;
- StatusBt;
- end;
- procedure TForm4.Bt_LoeschenClick(Sender: TObject);
- var
- BufferStack: TStack<PNode>;
- Stack: TStack<PNode>;
- PBufferNode: PNode;
- rl: Char;
- begin
- if PStandNode = PWurzelNode then
- begin
- ShowMessage('Du kannst die Wurzel nicht löschen!');
- end
- else
- begin
- PBufferNode := PParentNode;
- if (PStandNode.FLinks <> nil) or (PStandNode.FRechts <> nil) then
- begin
- if MessageBox(Handle,'Ganzer Teilbaum löschen?','Bestätigen',MB_YESNO) = IDNO then
- begin
- if MessageBox(Handle, 'Einzelner Knoten löschen?', 'Bestätigen', MB_YESNO) = IDYES then
- begin
- //Methode zum löschen des einzelnen Knotens
- EinzelnerKnotenLoeschen;
- Exit;
- end;
- MessageDlg('Löschen wurde abgebrochen!', mtInformation,[mbOk], 0, mbOk);
- Exit;
- end;
- end;
- if PParentNode.FLinks = PStandNode then
- begin
- rl := 'l';
- end
- else if PParentNode.FRechts = PStandNode then
- begin
- rl := 'r';
- end;
- if ((PStandNode.FLinks <> nil) and (PStandNode.FRechts <> nil)) then
- begin
- BufferStack := TStack<PNode>.Create;
- Stack := TStack<PNode>.Create;
- BufferStack.Push(PStandNode);
- Stack.Push(PStandNode);
- PStandNode := PStandNode.FLinks;
- BufferStack.Push(PStandNode);
- if Stack.Count <> 0 then
- begin
- repeat
- begin
- if ((PStandNode.FLinks <> nil) and (PStandNode.FRechts <> nil)) then
- begin
- if Stack.Peek <> PStandNode then
- begin
- Stack.Push(PStandNode);
- end;
- PStandNode := PStandNode.FLinks;
- end
- else if PStandNode.FRechts <> nil then
- begin
- PStandNode := PStandNode.FRechts;
- end
- else if PStandNode.FLinks <> nil then
- begin
- PStandNode := PStandNode.FLinks;
- end
- else
- begin
- PStandNode := Stack.Peek;
- Stack.Extract;
- Stack.TrimExcess;
- PStandNode := PStandNode.FRechts;
- if (PStandNode.FLinks <> nil) and (PStandNode.FRechts <> nil) then
- begin
- Stack.Push(PStandNode);
- end;
- end;
- BufferStack.Push(PStandNode);
- end;
- until Stack.Count = 0;
- end;
- Stack.Clear;
- Stack.Free;
- while BufferStack.Count <> 0 do
- begin
- //Nehme aus BufferStack und lösche (+TTreeView)
- PStandNode := BufferStack.Peek;
- BufferStack.Extract;
- BufferStack.TrimExcess;
- TV.Items.Delete(PStandNode.FTreeNode);
- PStandNode.FTreeNode := nil;
- PStandNode.Flinks := nil;
- PStandNode.Frechts := nil;
- FreeAndNil(PStandNode);
- end;
- BufferStack.Clear;
- BufferStack.Free;
- end;
- if (PBufferNode.FLinks <> nil) and (rl = 'l') then
- begin
- if PBufferNode.FLinks.FDaten = '' then
- begin
- PBufferNode.FLinks := nil;
- end
- else
- begin
- PBufferNode.FTreeNode.Selected := False;
- TV.Items.Delete(PBufferNode.FLinks.FTreeNode);
- PBufferNode.FLinks.FTreeNode := nil;
- PBufferNode.FLinks.FLinks := nil;
- PBufferNode.FLinks.FRechts := nil;
- FreeAndNil(PBufferNode.FLinks);
- PBufferNode.FLinks := nil;
- end;
- end;
- if (PBufferNode.FRechts <> nil) and (rl = 'r') then
- begin
- if PBufferNode.FRechts.FDaten = '' then
- begin
- PBufferNode.FRechts := nil;
- end
- else
- begin
- PBufferNode.FTreeNode.Selected := False;
- TV.Items.Delete(PBufferNode.FRechts.FTreeNode);
- PBufferNode.FRechts.FTreeNode := nil;
- PBufferNode.FRechts.FLinks := nil;
- PBufferNode.FRechts.FRechts := nil;
- FreeAndNil(PBufferNode.FRechts);
- PBufferNode.FRechts := nil;
- end;
- end;
- PStandNode := PWurzelNode;
- PStandNode.FTreeNode.Selected := True;
- Lb_Ausgabe.Caption := PStandNode.FDaten;
- StatusBt;
- end;
- end;
- {begin
- if PStandNode = PParentNode.rechts then
- begin
- TV.Items.Delete(PStandNode.TreeNode);
- PStandNode.TreeNode := nil;
- PParentNode.rechts := nil;
- end
- else if PStandNode = PParentNode.links then
- begin
- PParentNode.links := nil;
- TV.Items.Delete(PStandNode.TreeNode);
- PStandNode.TreeNode := nil;
- end;
- if (PParentNode = PWurzelNode) or not ((PParentNode.rechts = nil) and (PParentNode.links = nil)) then
- begin
- Dec(BlaetterZaehlen);
- end;
- FreeAndNil(PStandNode);
- PStandNode := PWurzelNode;
- Lb_Ausgabe.Caption := PStandNode.daten;
- StatusBt;
- Dec(NodeZaehlen);
- end; }
- procedure TForm4.EinzelnerKnotenLoeschen;
- var
- rl: Char;
- PStandBufferNode: PNode;
- TStandBufferNode: TNodeTest;
- BufferStack: TStack<PNode>;
- Stack: TStack<PNode>;
- BufferTextStack: TStack<String>;
- begin
- TStandBufferNode := TNodeTest.Create;
- PStandBufferNode.FRechts := PStandNode.FRechts;
- PStandBufferNode.FLinks := PStandNode.FLinks;
- if PStandNode = PParentNode.FLinks then
- begin
- rl := 'l';
- end
- else if PStandNode = PParentNode.FRechts then
- begin
- rl := 'r';
- end;
- if rl = 'r' then
- begin
- PStandNode := PStandNode.FLinks;
- end
- else if rl = 'l' then
- begin
- PStandNode := PStandNode.FRechts;
- end;
- if (PStandNode.FLinks = nil) or (PStandNode.FRechts = nil) then
- begin
- BufferTextStack := TStack<String>.Create;
- BufferTextStack.Push(PStandNode.FDaten);
- end
- else if ((PStandNode.FLinks <> nil) and (PStandNode.FRechts <> nil)) then
- begin
- BufferStack := TStack<PNode>.Create;
- BufferTextStack := TStack<String>.Create;
- Stack := TStack<PNode>.Create;
- BufferStack.Push(PStandNode);
- BufferTextStack.Push(PStandNode.FDaten);
- Stack.Push(PStandNode);
- PStandNode := PStandNode.FLinks;
- BufferStack.Push(PStandNode);
- BufferTextStack.Push(PStandNode.FDaten);
- if Stack.Count <> 0 then
- begin
- repeat
- begin
- if ((PStandNode.FLinks <> nil) and (PStandNode.FRechts <> nil)) then
- begin
- if Stack.Peek <> PStandNode then
- begin
- Stack.Push(PStandNode);
- end;
- PStandNode := PStandNode.FLinks;
- end
- else if PStandNode.FRechts <> nil then
- begin
- PStandNode := PStandNode.FRechts;
- end
- else if PStandNode.FLinks <> nil then
- begin
- PStandNode := PStandNode.FLinks;
- end
- else
- begin
- PStandNode := Stack.Peek;
- Stack.Extract;
- Stack.TrimExcess;
- PStandNode := PStandNode.FRechts;
- if (PStandNode.FLinks <> nil) and (PStandNode.FRechts <> nil) then
- begin
- Stack.Push(PStandNode);
- end;
- end;
- BufferStack.Push(PStandNode);
- BufferTextStack.Push(PStandNode.FDaten);
- end;
- until Stack.Count = 0;
- end;
- Stack.Clear;
- Stack.Free;
- while BufferStack.Count <> 0 do
- begin
- //Nehme aus BufferStack und lösche (+TTreeView)
- PStandNode := BufferStack.Peek;
- BufferStack.Extract;
- BufferStack.TrimExcess;
- TV.Items.Delete(PStandNode.FTreeNode);
- PStandNode.FTreeNode := nil;
- PStandNode.FLinks := nil;
- PStandNode.FRechts := nil;
- FreeAndNil(PStandNode);
- end;
- BufferStack.Clear;
- BufferStack.Free;
- end;
- if rl = 'r' then
- begin
- if PStandNode.FRechts <> nil then
- begin
- PStandBufferNode.FRechts.FTreeNode.MoveTo(PParentNode.FTreeNode, naAddChildFirst); //Nicht löschen, sondern so wie unten
- end;
- TV.Items.Delete(PParentNode.FRechts.FTreeNode);
- PParentNode.FRechts := PStandBufferNode.FRechts;
- end
- else if rl = 'l' then
- begin
- if PStandBufferNode.FLinks <> nil then
- begin
- PStandBufferNode.FLinks.FTreeNode.MoveTo(PParentNode.FTreeNode, naAddChild);
- end;
- TV.Items.Delete(PParentNode.FLinks.FTreeNode);
- PParentNode.FLinks := PStandBufferNode.FLinks;
- end
- else
- begin
- ShowMessage(' (rl <> r) and (rl <> l)');
- end;
- while BufferTextStack.Count <> 0 do
- begin
- Einfuegen(BufferTextStack.Peek);
- BufferTextStack.Extract;
- BufferTextStack.TrimExcess;
- end;
- if BufferTextStack <> nil then
- begin
- BufferTextStack.Clear;
- BufferTextStack.Free;
- end;
- FreeAndNil(TStandBufferNode);
- PStandNode := PWurzelNode;
- PStandNode.FTreeNode.Selected := True;
- Lb_Ausgabe.Caption := PStandNode.FDaten;
- StatusBt;
- end;
- procedure TForm4.Bt_NodeZaehlenClick(Sender: TObject);
- var
- Stack: TStack<PNode>;
- PBufferNode: PNode;
- i: Integer;
- begin
- if PWurzelNode <> nil then
- begin
- Stack := TStack<PNode>.Create;
- i := 0;
- PBufferNode := PWurzelNode;
- Inc(i);
- if ((PWurzelNode.FLinks <> nil) and (PWurzelNode.FRechts <> nil)) then
- begin
- Stack.Push(PBufferNode);
- PBufferNode := PBufferNode.FLinks;
- Inc(i);
- end;
- if Stack.Count <> 0 then
- begin
- repeat
- begin
- if ((PBufferNode.FLinks <> nil) and (PBufferNode.FRechts <> nil)) then
- begin
- if (Stack.Count = 0) or (Stack.Peek <> PBufferNode) then
- begin
- Stack.Push(PBufferNode);
- end;
- PBufferNode := PBufferNode.FLinks;
- end
- else if PBufferNode.FRechts <> nil then
- begin
- PBufferNode := PBufferNode.FRechts;
- end
- else if PBufferNode.FLinks <> nil then
- begin
- PBufferNode := PBufferNode.FLinks;
- end
- else
- begin
- PBufferNode := Stack.Peek;
- Stack.Extract;
- Stack.TrimExcess;
- PBufferNode := PBufferNode.FRechts;
- if (PBufferNode.FLinks <> nil) and (PBufferNode.FRechts <> nil) then
- begin
- Stack.Push(PBufferNode);
- end;
- end;
- Inc(i);
- end;
- until Stack.Count = 0;
- end;
- Stack.Clear;
- Stack.Free;
- ShowMessage('Es gibt ' + IntToStr(i) + ' Knoten');
- end
- else
- begin
- ShowMessage('Es gibt 0 Knoten');
- end;
- end;
- procedure TForm4.Bt_RechtsClick(Sender: TObject);
- begin
- PStandNode.FTreeNode.Selected := False;
- PParentNode := PStandNode;
- PStandNode := PStandNode.FRechts;
- PStandNode.FTreeNode.Selected := True;
- Lb_Ausgabe.Caption := PStandNode.FDaten;
- StatusBt;
- end;
- procedure TForm4.Bt_TiefeClick(Sender: TObject);
- begin
- ShowMessage('Tiefe: ' + IntToStr(Hoehe(PWurzelNode)));
- end;
- procedure TForm4.Bt_WurzelClick(Sender: TObject);
- begin
- PStandNode.FTreeNode.Selected := False;
- PStandNode := PWurzelNode;
- Lb_Ausgabe.Caption := PStandNode.FDaten;
- StatusBt;
- PParentNode := nil;
- PStandNode.FTreeNode.Selected := True;
- end;
- procedure TForm4.FormCreate(Sender: TObject);
- begin
- Bt_Links.Enabled := False;
- Bt_Rechts.Enabled := False;
- Bt_Wurzel.Enabled := False;
- Bt_Aendern.Enabled := False;
- PWurzelNode := nil;
- PStandNode := nil;
- PParentNode := nil;
- Tag := 0;
- //AUF 42 ZEICHEN BESCHRÄNKEN
- Ed_Eingabe.MaxLength := 42;
- TV.HideSelection := False;
- TV.FullExpand;
- end;
- procedure TForm4.StatusBt;
- begin
- Bt_Links.Enabled := PStandNode.FLinks <> nil;
- Bt_Rechts.Enabled := PStandNode.FRechts <> nil;
- Bt_Aendern.Enabled := PWurzelNode <> nil;
- end;
- procedure TForm4.TVMouseUp(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- begin
- if (TV.Selected <> nil) and (TV.Selected <> PStandNode.FTreeNode) then
- begin
- AktuallisiereMaus; //Nach PNode suchen, welches PNode.TreeNode = TV.Selected hat und PStandNode := PNode(Buffer) und Anzeige, Buttons,... aktuallisieren
- end;
- end;
- procedure TForm4.AktuallisiereMaus;
- var
- Stack: TStack<PNode>;
- begin
- if PWurzelNode <> nil then
- begin
- PStandNode.FTreeNode.Selected := False;
- PParentNode := nil;
- Stack := TStack<PNode>.Create;
- PStandNode := PWurzelNode;
- if ((PStandNode.Flinks <> nil) and (PStandNode.FRechts <> nil)) and (PStandNode.FTreeNode <> TV.Selected) then
- begin
- Stack.Push(PStandNode);
- PParentNode := PStandNode;
- PStandNode := PStandNode.FLinks;
- end;
- if PStandNode.FTreeNode <> TV.Selected then
- begin
- repeat
- begin
- if ((PStandNode.FLinks <> nil) and (PStandNode.FRechts <> nil)) and (PStandNode.FTreeNode <> TV.Selected) then
- begin
- if (Stack.Count = 0) or (Stack.Peek <> PStandNode) then
- begin
- Stack.Push(PStandNode);
- end;
- PParentNode := PStandNode;
- PStandNode := PStandNode.FLinks;
- end
- else if PStandNode.FRechts <> nil then
- begin
- PParentNode := PStandNode;
- PStandNode := PStandNode.FRechts;
- end
- else if PStandNode.FLinks <> nil then
- begin
- PParentNode := PStandNode;
- PStandNode := PStandNode.FLinks;
- end
- else
- begin
- PStandNode := Stack.Peek;
- Stack.Extract;
- Stack.TrimExcess;
- PParentNode := PStandNode;
- PStandNode := PStandNode.FRechts;
- if (PStandNode.FLinks <> nil) and (PStandNode.FRechts <> nil) then
- begin
- Stack.Push(PStandNode);
- end;
- end;
- end;
- until PStandNode.FTreeNode = TV.Selected;
- end;
- Stack.Clear;
- Stack.Free;
- PStandNode.FTreeNode.Selected := True;
- Lb_Ausgabe.Caption := PStandNode.FDaten;
- StatusBt;
- end;
- end;
- function TForm4.Hoehe;
- var
- links, rechts: Integer;
- begin
- if p = nil then
- begin
- result := 0;
- end
- else
- begin
- links := Hoehe(p.FLinks) + 1 ;
- rechts := Hoehe(p.FRechts) + 1;
- if rechts > links then
- begin
- result := rechts;
- end
- else
- begin
- result := links;
- end;
- end;
- end;
- function TForm4.GetErgebnis;
- var
- ergebnis: TStringList;
- Stack: TStack<PNode>;
- PBufferNode: PNode;
- begin
- ergebnis := TStringList.Create;
- if PWurzelNode <> nil then
- begin
- eingegeben := True;
- Stack := TStack<PNode>.Create;
- ergebnis := TStringList.Create;
- PBufferNode := PWurzelNode;
- ergebnis.Add(PBufferNode.FDaten);
- if (PWurzelNode.FLinks <> nil) and (PWurzelNode.FRechts <> nil) then
- begin
- Stack.Push(PBufferNode);
- PBufferNode := PBufferNode.FLinks;
- ergebnis.Add(PBufferNode.FDaten);
- end;
- if Stack.Count <> 0 then
- begin
- repeat
- begin
- if ((PBufferNode.FLinks <> nil) and (PBufferNode.FRechts <> nil)) then
- begin
- if Stack.Peek <> PBufferNode then
- begin
- Stack.Push(PBufferNode);
- end;
- PBufferNode := PBufferNode.FLinks;
- end
- else if PBufferNode.FRechts <> nil then
- begin
- PBufferNode := PBufferNode.FRechts;
- end
- else if PBufferNode.FLinks <> nil then
- begin
- PBufferNode := PBufferNode.FLinks;
- end
- else
- begin
- PBufferNode := Stack.Peek;
- Stack.Extract;
- Stack.TrimExcess;
- PBufferNode := PBufferNode.FRechts;
- if (PBufferNode.FLinks <> nil) and (PBufferNode.FRechts <> nil) then
- begin
- Stack.Push(PBufferNode);
- end;
- end;
- ergebnis.Add(PBufferNode.FDaten);
- end;
- until Stack.Count = 0;
- end;
- Stack.Clear;
- Stack.Free;
- end
- else
- begin
- eingegeben := False;
- end;
- result := ergebnis;
- end;
- function TForm4.Durchgelaufen;
- begin
- result := eingegeben;
- end;
- procedure TForm4.SetErgebnis;
- var
- i: Integer;
- begin
- i := 0;
- while i < daten.Count do
- begin
- Einfuegen(daten[i]);
- Inc(i);
- end;
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement